假设某事类似于给定的以下对象:
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 属性的对象(数组)来将其转换为对象。所以在我的例子中它将是:
const result = {
id: 'foo',
nestedObject: {
id: 'nested',
nestedObjects: [{
id: 'bar',
anotherNested: {
id: 'n1',
oneMoreNestedObjects: [{
id: 'n11',
}, {
id: 'n12',
}]
}
}, {
id: 'bar2',
}]
}
};
顺便说一句:我很喜欢使用 lodash。
最佳答案
您可以对嵌套数组和对象使用迭代和递归方法。
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; }
关于javascript - 将对象结构减少为仅包含特定属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43755505/