2015-05-16 4 views
0

dataSet содержит массивы объектов javascript. Каждый объект имеет свойство color и weight. Я могу сортировать данные на основе color. Однако я хотел бы знать, как сортировать и объединять данные, основанные на color и weight вместе, а затем передавать данные anСортировка объектов javascript на основе нескольких свойств

Другими словами, пусть говорят, у меня есть два массива яваскрипта объектов. Я хотел бы найти пару этих объектов (color, weight) во всех dataSet, затем нажмите.

Вход:

dataSet[0].data= [ 
    {color:"yellow",weight:12} 
    ,{color:"yellow", weight:12} 
    ,{color:"yellow", weight:12} 
    ,{color:"red",weight:13} 
    ,{color:"red", weight:13} 
];   
dataSet[1].data= [ 
    {color:"yellow",weight:12} 
    ,{color:"yellow", weight:12} 
    ,{color:"red",weight:13} 
    ,{color:"red",weight:13} 
    ,{color:"blue",weight:11} 
    ,{color:"blue",weight:11} 
]; 
colorMap=["red","green","blue","yellow","pink","black"]; 

Токовый выход:

an[0]=[ 
    {color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
] 
an[1]=[{color:"red",weight:13},{color:"red",weight:13}] 
an[2]=[{color:"yellow",weight:12},{color:"yellow",weight:12}] 
an[3]=[{color:"red",weight:13},{color:"red",weight:13}] 
an[4]=[{color:"blue",weight:11},{color:"blue",weight:11}] 

Желаемый результат:

an[0]=[ 
    {color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
    ,{color:"yellow",weight:12} 
] 
an[1]=[ 
    {color:"red",weight:13} 
    ,{color:"red",weight:13} 
    ,{color:"red",weight:13} 
    ,{color:"red",weight:13} 
] 
an[2]=[{color:"blue",weight:11},{color:"blue",weight:11}] 

Вот моя текущая реализация

for (i = 0; i < dataSet.length; i++) { 
    for (j = 0; j < self.colorMap.length; j++) { 
     var d = dataSet[i].data.filter(function (x) { return x.color == self.colorMap[j] }); 
     if (d.length > 0) { 
     an.push({ data: d, color: d[0].color, name:d[0].weight.toString()}); 
     } 
    } 
} 
+0

Не могли бы вы правильно отложить свой код? –

+1

Я уже 5 раз читал этот вопрос, и я до сих пор этого не понимаю. Сожалею. –

+0

Что такое 'colorMap' в блоке кода? Что такое 'dataSet', который у вас есть? Что такое '' '? – Oriol

ответ

1

Если вы используете подчеркивание, вы можете использовать функцию groupBy, чтобы помочь вам здесь. В противном случае вы можете определить groupBy самостоятельно.

function groupBy(arr, f) { 
    var result = {}; 
    arr.forEach(function(elem) { 
    var fElem = f(elem), 
     list = result[fElem] || []; 
    list.push(elem); 
    result[fElem] = list; 
    }); 
    return result; 
} 

function objToArray(obj) { 
    var result = []; 
    for(k in obj) { 
    result.push(obj[k]); 
    } 
    return result; 
} 

var dataSet = []; 
dataSet[0]= [{color:"yellow",weight:12},{color:"yellow", weight:12},{color:"yellow", weight:12},{color:"red",weight:13},{color:"red", weight:13}]; 
dataSet[1]= [{color:"yellow",weight:12},{color:"yellow", weight:12},{color:"red",weight:13},{color:"red",weight:13},{color:"blue",weight:11},{color:"blue",weight:11}]; 


var allData = dataSet.reduce(function(a, b) { return a.concat(b) }); 
var grouped = objToArray(groupBy(allData, function(data) { return data.color + "#" + data.weight })); 

console.log(grouped); 
+0

кстати. у того же цвета всегда одинаковый вес? – SpiderPig

+0

Да, тот же цвет имеет одинаковый вес. – casillas

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