我有一个JavaScript数组对象,如下所示:
var start = [{
name: 'example name',
nextItem: {}
},
{
name: 'example name 2',
nextItem: {}
},
{
name: 'example name 3',
nextItem: {}
}];
我想将此数组转换为单个嵌套对象,其中第一个数组项的内部nextItem
对象包含下一个数组项的整个对象。例如:
var output = {
name: 'example name',
nextItem: {
name: 'example name 2',
nextItem: {
name: 'example name 3',
nextItem: {}
}
}
}
有什么想法吗?
答案 0 :(得分:2)
可以使用递归功能完成:
function nestItems(items) {
var currentItem = items[0];
if (!currentItem) return {};
return {
name: currentItem.name,
nextItem: nestItems(items.slice(1))
};
}
nestItems(start);
答案 1 :(得分:2)
您可以使用Array.prototype.reduceRight()。
代码:
var start = [{name: 'example name',nextItem: {}},{name: 'example name 2',nextItem: {}},{name: 'example name 3',nextItem: {}}],
output = start.reduceRight(function (a, c) {
return {
name: c.name,
nextItem: a
};
});
console.log(output );

根据@NinaScholz的评论更新
答案 2 :(得分:0)
您可以在数组上使用reduce来添加对象:
function appendRec(obj, newObj) {
if (obj || obj.nextItem === {}) obj.nextItem = newObj
else appendRec(obj.nextItem, newObj)
return obj
}
var output = start.reduce((acc, obj) => {
return appendRec(acc, obj)
}, { nextItem: { } }).nextItem;
答案 3 :(得分:0)
试试这个:
var start = [{
name: 'example name',
nextItem: {}
},
{
name: 'example name 2',
nextItem: {}
},
{
name: 'example name 3',
nextItem: {}
}];
function concat(start) {
var output = start[0];
temp = output;
for(i = 1;i < start.length;i ++) {
temp.nextItem = start[i];
temp = temp.nextItem;
}
return output;
}
console.log(concat(start));
答案 4 :(得分:0)
可能有一种更优雅的方式,但这可以解决问题。 (诀窍是从底部开始并逐步提升)。
var start = [{
name: 'example name',
nextItem: {}
},
{
name: 'example name 2',
nextItem: {}
},
{
name: 'example name 3',
nextItem: {}
}];
var output = {};
for (var i = start.length; i > 0; i--) {
output = { name: start[i - 1].name, nextItem: output };
}
console.log(output);
&#13;
答案 5 :(得分:0)
您可以使用并将返回的累加器作为嵌套对象的目标,而不会改变原始数组。
var start = [{ name: 'example name', nextItem: {} }, { name: 'example name 2', nextItem: {} }, { name: 'example name 3', nextItem: {} }],
result = {};
start.reduce(function (o, a) {
o.name = a.name;
o.nextItem = {};
return o.nextItem;
}, result);
console.log(result);
console.log(start);
ES6改变原始数组。
var start = [{ name: 'example name', nextItem: {} }, { name: 'example name 2', nextItem: {} }, { name: 'example name 3', nextItem: {} }],
result = {};
start.reduce(function (o, a) {
Object.assign(o, a);
return o.nextItem;
}, result);
console.log(result);
console.log(start);