2017-08-16 130 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);