使用對象進行分組。
var categories = {};
function incrementBy(category, value) {
if (!categories[category]) {
categories[category] = 0;
}
categories[category] += value;
}
var datasetarr = [];
var pos;
for(var i = 0; i < arr.length; i++){
console.log('unsorted ' + arr[i].type + ' ' + arr[i].quantity);
incrementBy(arr[i].type, arr[i].quantity)
}
for(var category in categories){
console.log('sorted ' + category + ' ' + categories[category]);
}
如果需要,可以將對象分解成數組並根據需要進行排序。
一點點清潔的例子,這可能讓你沿着一個小咬更好地遵循:
function group(array) {
var categories = {};
function incrementBy(object) {
var category = categories[object.type];
if (!category) {
category = categories[object.type] = {};
}
var subCategory = category[object.subType];
if (!subCategory) {
subCategory = category[object.subType] = {};
}
subCategory += object.value;
}
array.forEach(function (value, index, arr) {
incrementBy(value, value.quantity)
});
return categories;
}
:
var arr = [{type: 'kitchen appliance', quantity: 2},
{type: 'home entertainment', quantity: 2},
{type: 'home entertainment', quantity: 3},
{type: 'batteries & lightings', quantity: 2},
{type: 'home entertainment', quantity: 2},
{type: 'home appliance', quantity: 5},
{type: 'kitchen appliance', quantity: 4},
{type: 'kitchen appliance', quantity: 5},
{type: 'kitchen appliance', quantity: 3},
{type: 'kitchen appliance', quantity: 4},
{type: 'kitchen appliance', quantity: 1},
{type: 'home entertainment', quantity: 1},
{type: 'home appliance', quantity: 5},
{type: 'batteries & lightings', quantity: 2},
{type: 'kitchen appliance', quantity: 2},
{type: 'home appliance', quantity: 2}];
function group(array) {
var categories = {};
function incrementBy(category, value) {
if (!categories[category]) {
categories[category] = 0;
}
categories[category] += value;
}
array.forEach(function (value, index, arr) {
incrementBy(value.type, value.quantity)
});
return categories;
}
function print(categories) {
for (var category in categories) {
console.log('%s: %s', category, categories[category]);
}
}
print(group(arr));
這裏的group
隱藏分組,這比可容納自己的實現的解決方案
根據你的使用情況,您也可以扁平化結構:
function incrementBy(object) {
var key = [object.type, object.subType].join('/');
var category = categories[key];
if (!category) {
category = categories[key] = {};
}
subCategory += object.value;
}
但它可能是有意義的有各種地圖到位:
function groupings(array) {
var groupings = {
types: {},
subTypes: {},
paths: {}
};
function incrementBy(object) {
var category = groupings['types'][object.type];
if (!category) {
category = groupings['types'][object.type] = {};
}
category += object.value;
var subCategory = groupings['subTypes'][object.subType];
if (!subCategory) {
subCategory = groupings['subTypes'][object.subType] = {};
}
subCategory += object.value;
var key = [object.type, object.subType].join('/');
var path = groupings['paths'][key];
if (!path) {
path = groupings['paths'][key] = {};
}
path += object.value;
}
array.forEach(function (value, index, arr) {
incrementBy(value, value.quantity)
});
return categories;
}
爲了避免聚合信息丟失,你可以簡單地創建一個更復雜的數據結構:
function groupByAndSumBy(data, groupByProperty, sumByProperty) {
var accumulator = {};
data.forEach(function(object, index, array) {
var localAcc = accumulator[groupByProperty]
= accumulator[groupByProperty] || { items: [] };
localAcc[sumByProperty]
= (localAcc[sumByProperty] || 0) + object[sumByProperty];
localAcc.items.push(object);
});
return accumulator;
}
function groupByMerchantNameAndSumByTotalSales(data) {
return groupByAndSumBy(data, 'merchantName', 'totalSales');
}
這將創建一個集合,其還包含輸入數組的子集,它允許您更詳細地查看數據。
它會更容易幫助你,如果你與實際陣列替換圖像(代碼).. – MedAli
如果你可以添加一些有用的代碼,比如「數組A」,「數組B」和「datasetarr」會更容易。或者甚至更好,在小提琴,片段或類似的工作示例。 – gmo
編輯的問題與ARR和適當的命名約定,而不是陣列A/B – guest176969