2016-08-05 51 views
-3

讓我們假設我有1000個對象。現在,我想將具有相同名稱的對象存儲在數組中,以便讓多個數組具有相同名稱的對象。這怎麼能在JavaScript中完成? 數據可以是這樣的基於元素的Javascript中的對象陣列

Data can be like this

+0

@ MaazKhan47你有JSON對象?你想存儲在數組中? –

+0

@BunkerBoy是Json對象 – MaazKhan47

回答

1

var input = [ 
 
     { name: 'ABC', age: 12 }, 
 
     { name: 'XYZ', age: 13 }, 
 
     { name: 'ABC', age: 14 }, 
 
     { name: 'XYZ', age: 15 }, 
 
    ]; 
 
    
 
    var output = {}; 
 
    
 
    input.forEach(function(obj) { 
 
     var array = output[obj.name]; 
 
    
 
     if (!array) { 
 
      array = output[obj.name] = []; 
 
     } 
 
    
 
     array.push(obj) 
 
    }) 
 

 
    for(name in output) { 
 
     console.log('There are ' + output[name].length + ' people named ' + name); 
 
    }

+0

(你可以將你的代碼轉換爲片段嗎?) – evolutionxbox

+1

對你而言,任何東西:) –

-1

在JavaScript中,對象不被複制到陣列。它們存在於內存中,當添加到數組中時,該對象的引用就是數組中的內容。

在以下代碼中,myObj === arr1[0] === arr2。這意味着符合下列條件:

var myObj = {name:'Dave', age: 55}; 
 
var arr1 = [myObj]; 
 
var arr2 = [myObj]; 
 

 
arr2[0].age = 44; 
 
console.log(myObj.age); 
 
// prints 44 
 
console.log(arr1[0].age); 
 
// prints 44

因此,要獲得你需要什麼,你只需要您的數據組織成陣列。在JavaScript中,可以過濾數組:

// original data 
 
var data = [ 
 
{name: 'ABC', age: 12}, 
 
{name: 'XYZ', age: 13}, 
 
{name: 'ABC', age: 14}, 
 
{name: 'XYZ', age: 15}, 
 
{name: 'XYZ', age: 16}, 
 
]; 
 
    
 
// this returns a function to be used in Array.filter to filter for objects with the specified name 
 
function nameFilter(name) { 
 
    return function(datum) { 
 
    return datum.name === name; 
 
    } 
 
} 
 
    
 
// filter for each type 
 
var abcPeople = data.filter(nameFilter('ABC')); 
 
var xyzPeople = data.filter(nameFilter('XYZ')); 
 
     
 
console.log(data.length); 
 
//5 
 
console.log(abcPeople.length); 
 
//2 
 
console.log(xyzPeople.length); 
 
//3 
 
    

如果運行上面的代碼,就必須3個陣列和在abcPeople所有對象也將是data,使得任何改變一個會反映在其他。 xyzPeople也是如此。 要清楚,filter會創建一個新陣列,因此data未被修改。

更新:新增例子名單是動態確定

// original data 
 
var data = [ 
 
    {name: 'ABC', age: 12}, 
 
    {name: 'XYZ', age: 13}, 
 
    {name: 'ABC', age: 14}, 
 
    {name: 'XYZ', age: 15}, 
 
    {name: 'XYZ', age: 16}, 
 
]; 
 
     
 
var sortedData = {}; 
 
    
 
data.forEach(function(datum){ 
 
    // initializes an array for any unseen name 
 
    if(!sortedData[datum.name]) { 
 
    sortedData[datum.name] = []; 
 
    } 
 
    // add the datum to the list for its name 
 
    sortedData[datum.name].push(datum); 
 
}); 
 

 
// all names 
 
console.log(Object.keys(sortedData)); 
 
// "ABC", "XYZ" 
 

 
// items named "ABC" 
 
console.log(sortedData['ABC']); 
 
// [{"name": "ABC","age": 12}, {"name": "ABC","age": 14}]

+0

那麼這裏的複雜性是我可以有這麼多類型(名稱),那麼我想如何過濾每個類型? – MaazKhan47

+0

如果你有一個名字列表,你可以遍歷它。如果沒有,那麼你可以遍歷原始列表並以這種方式拆分對象。你最終會得到一個數組的對象 – pgreen2