2016-08-05 52 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