javascript - 按字段名称减少或映射对象
问题描述
我有一个像这样的对象:
const obj = {
obj2: {
number: 123123,
obj3: [{
number: 321321
}, {
number: 543543
}]
},
obj5: {
number: 52343,
obj6: [{
number: 753456
}, {
number: 12312
}]
},
}
想要的输出:[123123, 321321, 543543, 52343, 753456, 12312]
我解决它的方法只是..创建一个像
[obj2.number, obj2.obj3[0].number, obj5.number, obj5.obj6[0].number].find(el => Boolean(el))
它看起来很糟糕。无法弄清楚如何以功能方式进行操作。就像制作这个对象的对象条目,然后减少它并询问字段,如果它不存在,则更深入等。
或名为“数字”的字段中的第一个值不为空(布尔值 true)
解决方案
不是一种花哨的方式,也不能保证适用于每种情况,但您可以从这里开始
const obj = {
obj2: {
number: 123123,
obj3: [{
number: 321321
}, {
number: 543543
}]
},
obj5: {
number: 52343,
obj6: [{
number: 753456
}, {
number: 12312
}]
},
}
getPropValues = function(obj, name) {
let result = [];
if(Array.isArray(obj)) {
for(let i =0;i<obj.length;++i) {
let innerResult = getPropValues(obj[i],name);
result = result.concat(innerResult);
}
return result;
}
if(typeof obj === 'object') {
for (const [key, value] of Object.entries(obj)) {
if(key === name) {
result.push(value);
} else if(Array.isArray(value) || typeof value === 'object') {
result = result.concat(getPropValues(value,name));
}
}
}
return result;
}
console.log(getPropValues(obj,'number'))
推荐阅读
- sql - 引用名称取决于变量的宏列表
- javascript - 通过检查现有属性来细化流类型
- angularjs - 带有 angular-translate 的 ng-bind-html 呈现文本而不是 HTML 标记
- tensorflow - 如何在tensorflow中调试局部变量
- azure - azure functions 或 azure logic app 中是否有任何触发 Azure File Share 的触发器?
- sml - SML:错误:非构造函数应用于模式中的参数:-
- django - urlopen 错误 [Errno 54] 对等方重置连接
- java - Java 连接到 Amazon Redshift
- c - 查找字符串中最长单词的程序
- ios - iOS 为什么 NSParagraphStyle 会重置原始文本样式