假设给出以下对象:
const foo = {
id: 'foo',
name: '...',
test: () => 'fn',
nestedObject: {
id: 'nested',
name: '...',
nestedObjects: [{
id: 'bar',
name: '...',
anotherNested: {
id: 'n1',
name: '...',
oneMoreNestedObjects: [{
id: 'n11',
name: '...',
}, {
id: 'n12',
name: '...',
}]
}
}, {
id: 'bar2',
name: '...',
}]
}
};
我想通过仅选择名为id
的属性或者它是具有id属性的(Array of)对象来将其转换为对象。所以在我的例子中它将是:
const result = {
id: 'foo',
nestedObject: {
id: 'nested',
nestedObjects: [{
id: 'bar',
anotherNested: {
id: 'n1',
oneMoreNestedObjects: [{
id: 'n11',
}, {
id: 'n12',
}]
}
}, {
id: 'bar2',
}]
}
};
顺便说一句:我使用lodash很好。
答案 0 :(得分:1)
您可以对嵌套数组和对象使用迭代递归方法。
function filter(object) {
return Object.keys(object).reduce(function (r, k) {
if (k === 'id') {
r[k] = object[k];
} else if (object[k] && typeof object[k] === 'object') {
r[k] = filter(object[k]);
}
return r;
}, Array.isArray(object) ? [] : {});
}
var foo = { id: 'foo', name: '...', test: () => 'fn', nestedObject: { id: 'nested', name: '...', nestedObjects: [{ id: 'bar', name: '...', anotherNested: { id: 'n1', name: '...', oneMoreNestedObjects: [{ id: 'n11', name: '...', }, { id: 'n12', name: '...', }] } }, { id: 'bar2', name: '...', }] } },
result = filter(foo);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
您是否考虑过使用递归?注意深层对象,这可能超过最大调用堆栈。
function getIdsFromObjects(nObj) {
return Object.keys(nObj).reduce(function (curr, next) {
if (next === 'id') {
curr[next] = nObj[next]
}
if (Array.isArray(nObj[next])) {
curr[next] = nObj[next].map(function(mapObj) {
return getIdsFromObjects(mapObj)
})
}
if (typeof obj[next] === 'object' && !Array.isArray(nObj[next])) {
curr[next] = getIdsFromObjects(nObj[next])
}
return curr;
},{})
}
console.log(JSON.stringify(getIdsFromObjects(foo), null, 4))