2014-06-09 4 views
0

У меня есть массив, как:Массива Объединить на основе два значения

Name Qty Price 
happ 1 50 
happ 1 50 
happ 1 50 
happ 2 10 
app 1 50 
app 1 50 
app 1 50 
app 2 10 

, и я должен преобразовать и объединить как то с помощью JavaScript/JQuery:

Name Qty Price 
happ 3 50 
happ 2 10 
app 3 50 
app 2 10 

на основе равного имени и цен

Любая помощь должна быть оценена.

+0

Что вы сделали до сих пор? –

+0

@IqbalFauzi Я создал только массив javascript, но не могу найти, как это сделать с этим. – Happy

+0

Можете ли вы разместить свой массив? – hsz

ответ

2

Мне нравятся такие задачи. Они не сложны и помогают переключиться на рабочее состояние.

// Sample data 
arr = [{ name: 'happ', qty: 1, price: 50 }, 
     { name: 'happ', qty: 1, price: 50 }, 
     { name: 'happ', qty: 1, price: 50 }, 
     { name: 'harr', qty: 1, price: 50 }]; 
result = {}; 

// Summarize array by one walk 
arr.forEach(function(k) { 
    if (!result[k.name + k.price]) { 
    result[k.name + k.price] = k; 
    } else { 
    result[k.name + k.price].qty += k.qty; 
    } 
}); 

// convert object to array by one walk 
var finalResult = []; 
for (var key in result) { finalResult.push(result[key]) } 
+3

Обратите внимание на комбинацию 'k.name + k.price', если имя похоже на' happ5', а цена '15', у нас есть' happ515', в каком-то другом случае, если у нас есть имя как 'happ51 'и цена' 5', тогда у нас также есть 'happ515'. Таким образом, ключи дублируются. Однако такой случай не является кукольным, мы всегда можем использовать некоторый токен GUID, чтобы такой случай никогда не происходил. –

+0

@yarix Он отлично работает, но также модифицирует основной массив (arr). Как я могу остановить это, чтобы изменить основной массив, потому что я должен использовать и в следующий раз. – Happy

+0

@Happy вам нужно скопировать объект, а не назначать его 'result [k.name + k.price] = k' –

1

Эта задача эквивалентна запрос SQL:

SELECT name, sum(qty), price 
FROM dataObject 
GROUP BY name, price 
ORDER BY sum(qty) DESC 

Вы можете использовать встроенные функции .reduce() для aggregrate данных, а затем .sort() сортировать по qty:

HTML :

<div id="results"></div> 

Javascript:

// Sample data 
arr = [{ name: 'happ', qty: 1, price: 50 }, 
     { name: 'happ', qty: 1, price: 50 }, 
     { name: 'happ', qty: 1, price: 50 }, 
     { name: 'happ', qty: 2, price: 10 }, 
     { name: 'app', qty: 1, price: 50 }, 
     { name: 'app', qty: 1, price: 50 }, 
     { name: 'app', qty: 1, price: 50 }, 
     { name: 'app', qty: 2, price: 10 }]; 

var groupedObjects = arr.reduce(function(res, obj) { 
    if (!((obj.name + obj.price) in res)) 
     res.__array.push(res[obj.name + obj.price] = obj); 
    else { 
     res[obj.name + obj.price].qty += obj.qty;   
    } 
    return res; 
}, {__array:[]}).__array 
       .sort(function(a,b) { return b.qty - a.qty; }); 



// print results for testing 
_.each(groupedObjects,function(obj){ 
    var output = ''; 
    _.each(obj,function(val,key){ 
     output += key+': '+val+'<br>';   
    }); 
    output += '<br>'; 
    $('#results').append(output); 
}); 

Выход:

name: happ 
qty: 3 
price: 50 

name: app 
qty: 3 
price: 50 

name: happ 
qty: 2 
price: 10 

name: app 
qty: 2 
price: 1 

Working Demo

+0

Он отлично работает, но также модифицирует основной массив (arr). Как я могу остановить это, чтобы изменить основной массив Я должен использовать и в следующий раз. – Happy

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