2016-08-05 5 views
-3

私は1000のオブジェクトがあるとします。今では、同じ名前のオブジェクトを配列に格納したいので、同じ名前のオブジェクトを持つ複数の配列を作成します。これはJavaScriptでどのように行うことができますか? データはJavaScriptでこの要素に基づいたJavaScriptのオブジェクトの配列

Data can be like this

+0

を決定している例を追加しましたが、あなたは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

ようにすることができ、オブジェクトは、アレイにコピーされません。それらはメモリー内に存在し、配列に追加されると、そのオブジェクトへの参照は配列内に存在します。

次のコードでは、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:リストは動的MaazKhan47 @

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

関連する問題