2017-08-16 118 views
2

我有对象的JavaScript数组,像这样:转换对象的数组到嵌套对象在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: {} 
    } 
    } 
} 

任何想法?

+3

你有没有尝试过的东西,和你卡住的地方? – webdeb

+3

我投票结束这个问题作为题外话,因为问题显示输入和预期的输出格式,但没有显示任何努力的迹象。这是一个要求,而不是一个问题陈述。 – Rajesh

+0

@Rajesh已经发布了一个简单的解决方案来演示递归如何工作。因为这是丹尼尔的第一篇文章,下次他会更精确。但是,我也认为,如果这是真的,那么OP的一点点努力通常应该显示为 – webdeb

回答

0

你可以用减少阵列上添加对象:

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; 
+0

这将产生一个单一的nextItem对象,这是列表中的最后一个.. – webdeb

+1

正确的,请选择Yosvel Quinteros的答案。 –

+1

我更喜欢我的,是最优雅的国际海事组织:D – webdeb

0

试试这个:

function nestItems(items) { 
    var currentItem = items[0]; 
    if (!currentItem) return {}; 

    return { 
    name: currentItem.name, 
    nextItem: nestItems(items.slice(1)) 
    }; 
} 


nestItems(start); 
2

可以与递归函数来完成这样做可能会有一种更优雅的方式,但是这样做会有所斩获。 (诀窍是从底部开始并按照自己的方式进行)。

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);

+0

我们是否应该真的回答这样的问题,而不是显示任何努力的迹象? – Rajesh

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)); 
+0

我们真的应该回答这样一个没有表现出任何努力迹象的问题吗? – Rajesh

+2

@Rajesh - 问题完全有效。 – Archer

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

+1

hm反向?真?为什么不使用'reduceRight'? –

+1

代码是人类的第一名,所以可读性排在第一位 – webdeb

+0

是的,它不公平ik,它自己的解决方案是好的,所以upvote – webdeb

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);