2016-08-05 3 views
-3

Допустим, у меня есть 1000 объектов. Теперь я хочу хранить объекты с таким же именем в массиве. Таким образом, у меня будет несколько массивов с объектами с тем же именем. Как это можно сделать в JavaScript? Данные могут быть, как этотМассив объектов в Javascript на основе элемента

Data can be like this

+0

@ MaazKhan47 у вас есть объект JSON? который вы хотите сохранить в массиве? –

+0

@BunkerBoy Да Json Objects – 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 не изменяется.

UPDATE: Добавлен пример, где списки определяется динамически

// 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

Смежные вопросы