2016-08-25 51 views
1

我想通過用同一個ID泡泡多個對象來創建一個整潔的JSON對象。 以下是我嘗試過的: 1.存儲第一個對象的ID以匹配後續ID。 2.遍歷數組並檢查相似的ID,如果返回一個匹配,則將名稱作爲另一個數組中的對象推送,否則將推入具有存儲名稱的新對象作爲屬性。 3.空名稱。javascript中的唯一鍵上的Club JSON對象

有很多條件來檢查對象是否是數組的最後一個元素。我只是尋找一種優化的方式來實現這一點。考慮到問題的具體性質,我無法在SO中找到確切的類似問題。

我有一個JSON對象,如:

[ 
{ 
    id: 1, 
    name: 'John' 
}, 
{ 
    id: 1, 
    name: 'Jack' 
}, 
{ 
    id: 2, 
    name: 'Drake' 
}, 
{ 
    id: 2, 
    name: 'Joey' 
}, 
{ 
    id: 3, 
    name: 'Justin' 
}, 
{ 
    id: 3, 
    name: 'Rob' 
} 
] 

我想俱樂部有類似IDS在一起的物體,有點像這樣:

[{ 
    id: 1, 
    names: [{ 
     name: 'John' 
    }, 
    { 
     name: 'Jack' 
    }] 
}, 
{ 
    id: 2, 
    names: [{ 
     name: 'Drake' 
    }, 
    { 
     name: 'Joey' 
    }] 
}, 
{ 
    id: 3, 
    names: [{ 
     name: 'Justin' 
    }, 
    { 
     name: 'Rob' 
    }] 
}] 

回答

2

您可以使用Array#forEach併爲對象哈希值。

var data = [{ id: 1, name: 'John' }, { id: 1, name: 'Jack' }, { id: 2, name: 'Drake' }, { id: 2, name: 'Joey' }, { id: 3, name: 'Justin' }, { id: 3, name: 'Rob' }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    if (!this[a.id]) { 
 
     this[a.id] = { id: a.id, names: [] }; 
 
     grouped.push(this[a.id]); 
 
    } 
 
    this[a.id].names.push({ name: a.name }); 
 
}, Object.create(null)); 
 

 
console.log(grouped);

+3

了'forEach'調用存儲索引 – Phil

+0

感謝尼娜,這是有幫助的。 雖然只有一個問題,在這裏做空對象到底是什麼? –

+2

部件'Object.create(null)'創建一個真正的空對象,沒有原型,比如'toString'。這個對象被用作回調廣告哈希表中的'this'對象,以引用'id'。 –

1

使用Array#reduce方法與索引參考對象。

var data = [{ id: 1, name: 'John'}, { id: 1, name: 'Jack'}, { id: 2, name: 'Drake'}, { id: 2, name: 'Joey'}, { id: 3, name: 'Justin'}, { id: 3, name: 'Rob'}]; 
 

 
// object for index reference 
 
var ind = {}; 
 

 
// iteraate over array 
 
var res = data.reduce(function(arr, obj) { 
 
    // check index defined already 
 
    if (ind.hasOwnProperty(obj.id)) { 
 
    // if defined then push the name value 
 
    arr[ind[obj.id]].names.push({name: obj.name}); 
 
    } else { 
 
    // else push a new object in prefered format 
 
    arr.push({ id: obj.id, names: [{ name: obj.name }] }); 
 
    // define the index in reference object 
 
    ind[obj.id] = arr.length - 1; 
 
    } 
 
    // return the updated array 
 
    return arr; 
 
    // set initial value as epty array 
 
}, []); 
 

 
console.log(res);

這真的華而不實使用`this` ARG爲