我想做类似以下的事情,但以更大规模和更有效的方式。假设我有一个对象数组,其中每个对象都需要水平/展平。
转换这样的东西......
[{
name: 'John Doe',
address: {
apartment: 1550,
streetno: 167,
streetname: 'Victoria',
},
}, {
name: 'Joe Smith',
address: {
apartment: 2,
streetno: 111,
streetname: 'Jones',
},
}]
……到那个……
[{
name: 'John Doe',
apartment: 1550,
streetno: 167,
streetname: 'Victoria',
}, {
name: 'Joe Smith',
apartment: 2,
streetno: 111,
streetname: 'Jones',
}]
如上所示,address
还有一个需要调平/展平的对象。
但最重要的是,人们事先并不知道对象/数据结构。因此,人们既不知道属性名称也不知道嵌套级别的深度。
“所以在收到这个物体之前,你对它的结构知之甚少。”
OP 的主要任务实际上是将任何给定的基于嵌套对象的数据结构平级为仅具有单个条目级别的对象。而且由于人们事先对数据结构一无所知,因此必须提出一种递归方法。
一旦实现,这种原因函数可以用作数组map
ping 过程的回调。
递归实现本身是基于类型检测(区分Array
- 和 -Object
类型和原始值)和根据当前处理的类型的对象reduce
的entries
(键值对) 。value
function recursivelyLevelObjectEntriesOnly(type) {
let result = type;
if (Array.isArray(type)) {
result = type
.map(recursivelyLevelObjectEntriesOnly);
} else if (type && 'object' === typeof type) {
result = Object
.entries(type)
.reduce((merger, [key, value]) => {
if (value && 'object' === typeof value && !Array.isArray(value)) {
Object.assign(merger, recursivelyLevelObjectEntriesOnly(value));
} else {
merger[key] = recursivelyLevelObjectEntriesOnly(value);
}
return merger;
}, {});
}
return result;
}
const sampleData = [{
name: 'John Doe',
address: { apartment: 1550, streetno: 167, streetname: 'Victoria' },
}, {
name: 'Joe Smith',
address: { apartment: 2, streetno: 111, streetname: 'Jones' },
}, {
foo: {
bar: "bar",
baz: "baz",
biz: {
buzz: "buzz",
bizz: [{
name: 'John Doe',
address: { apartment: 1550, streetno: 167, streetname: 'Victoria' },
}, {
name: 'Joe Smith',
address: { apartment: 2, streetno: 111, streetname: 'Jones' },
}, {
foo: {
bar: "bar",
baz: "baz",
biz: {
buzz: "buzz",
booz: {
foo: "foo",
},
},
},
}],
booz: {
foo: "foo",
},
},
},
}];
const leveledObjectData = sampleData.map(recursivelyLevelObjectEntriesOnly);
console.log({ leveledObjectData });
// no mutation at `sampleData`.
console.log({ sampleData });
.as-console-wrapper { min-height: 100%!important; top: 0; }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句