2013-03-20 63 views
1

我在JS中的對象中很新,所以我需要一些幫助。我有以下數組:如何將項目放入按特定鍵分組的分組數組中

var persons = [ 
    { fname : 'Steven', lname : 'Jameson', age : 20 }, 
    { fname : 'George', lname : 'Thrump', age : 40 }, 
    { fname : 'Peter', lname : 'Jacobs', age : 60 }, 
    { fname : 'Peter', lname : 'Thrump', age : 20 }, 
    { fname : 'Steven', lname : 'Henderson', age : 40 }, 
    { fname : 'John', lname : 'Jacobs', age : 30 }, 
    { fname : 'Steven', lname : 'Thrump', age : 50 }, 
    { fname : 'George', lname : 'Peterson', age : 40 }, 
    { fname : 'Peter', lname : 'Jameson', age : 60 } 
]; 

我需要按給定屬性對信息進行排序。我已經嘗試過function(array, 'property')。在我的情況下,它將是function(persons, 'fname')。我必須使用不同的名稱以及用於存儲關於具有該名稱的每個人的信息的關鍵字來實現對象。例如:

Object { 
    Steven : everyone with first name Steven, 
    George : everyone with first name George, 
    Peter : everyone with first name Peter, 
    John : everyone with first name John 
} 

我做到這一點:

function group(array, property) { 
     var object = {}; 

     for (var i = 0; i < persons.length; i++) { 
      object[persons[i][property]] = []; 

      object[persons[i][property]].push(persons[i]) 
     }; 
    }; 

創建具有不同的名稱作爲關鍵字對象,並給他們數組作爲值。然後我卡住了,不知道下一步該怎麼辦?有人可以幫忙,如果他有幾分鐘的時間來解釋一下。

在此先感謝。

+0

所以現在你要排序的對象的鑰匙?這是不可能的,你只能對數組進行排序。 – Bergi 2013-03-20 20:33:00

+1

你提到需要排序,但後來真的談論這些對象的分組。你是否需要做某種形式的分類以及分組,或者簡單地分組?我不完全明白你所困擾的是什麼。 – 2013-03-20 20:33:48

+1

您只需要爲每個密鑰初始化陣列一次,目前您正在覆蓋它。更改爲'if(!(persons [i] [property] in object))object [persons [i] [property]] = [];' – Bergi 2013-03-20 20:34:23

回答

4

唯一的問題似乎與這一行:

object[persons[i][property]] = []; 

它執行每次迭代,加入之前重置每個Array回空1個元素。它只是需要一個條件設置之前:

if (!(persons[i][property] in object)) 
    object[persons[i][property] = []; 

object[persons[i][property].push(persons[i]); 
+1

但不是那種情況。不具有空屬性的屬性不爲null – Bergi 2013-03-20 20:34:57

+1

+1(@Bergi和Jonathan)另一個問題:數組在函數中應該被稱爲'array'而不是'persons'。 – 2013-03-20 20:35:08

+1

'if(!object [persons [i] [property]])''會做。 – 2013-03-20 20:36:32

1

您應該檢查是否object[persons[i][property]]已經初始化

function group(persons, property) { 
    var object = {}; 

    for (var i = 0; i < persons.length; i++) { 
     if(!object[persons[i][property]]) { 
      object[persons[i][property]] = []; 
    } 

     object[persons[i][property]].push(persons[i]) 
    }; 
    return object; 
}; 
0
function group(array, property) { 
    var object = {}; 

    for (var i = 0; i < array.length; i++) { 
     var person = array[i]; 
     if (person[property]) { 
      object[person[property]] = object[person[property]] || []; 
      object[person[property]].push(person); 
     } 
    }; 

    return object; 
}; 

group(persons, "fname");