我有一个像:
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))
而且看起来很糟糕。无法弄清楚如何以功能方式做到这一点。 就像创建这个对象的对象条目,然后减少它并询问字段,如果它不存在,则深入等
或名为“number”的字段中的第一个值不为空(布尔值为真)
答案 0 :(得分:0)
不是一种奇特的方式,也不能保证适用于每种情况,但您可以从这里开始
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'))
答案 1 :(得分:-1)
const res = Object.values(obj).reduce((acc, rec) => {
return [...acc, ...Object.values(rec)]
}, []).map((it) => {
return typeof it === 'number' ? it : it.map((item) => Object.values(item))
}).reduce((acc, rec) => {
return typeof rec === 'number' ? [...acc, rec] : [...acc, ...rec]
},[]).reduce((acc, rec) => {
return typeof rec === 'number' ? [...acc, rec] : [...acc, ...rec]
},[])