1

使用javascript函數編程方法(如map/reduce),如何聚合/計數status字段arr1並將其轉換爲arr2中的鍵/值對象數組。聚合並轉換對象數組

arr1 = [ 
    {'task':'do something 1', 'status':'done'} , 
    {'task':'do something 2', 'status':'done'} , 
    {'task':'do something 3', 'status':'pending'} , 
    {'task':'do something 4', 'status':'done'} 
]; 

// Aggregate arr1 `status` field and transform to: 

arr2 = [ 
    {key:'done', value: 3}, 
    {key:'pending', value: 1} 
]; 

這裏是我的WIP 部分解決方案,處理只有聚集部分。我仍然需要轉換部分。

var arr2 = arr1.map(function(item) { 
    return item.status; 
    }).reduce(function(acc,curr,idx){ 
    if(acc[curr] === undefined) acc[curr] = 1; 
    else acc[curr] += 1; 
    return acc; 
    }, []); 
+1

給出的輸出我只是做[這](https://jsfiddle.net/ocqnnmw3/1/),但不知道它的 「功能性」 不夠。 – adeneo

+0

您的解決方案沒有給出預期的答案。或者提供的答案不正確。 – Kiril

+0

我相信@Kiril是正確的,發佈的代碼會產生'[done:3,pending:1]',換句話說,它將數組視爲一個對象,並且不會返回預期的結果? – adeneo

回答

0

這裏是最實用的方式,我可以想出。這既包括聚合和需要的變換:

var arr2 = Object.keys(arr2 = arr1.map(function(item) { 
    return item.status; 
}).reduce(function(acc,curr){ 
    acc[curr] = acc[curr] + 1 || 1; 
    return acc; 
}, [])).map(function(item){ 
    return {key: item, value: arr2[item]} 
}); 
+0

亞歷克斯,很好地完成。我所做的唯一清理是我自己的代碼 - 將第4行和第5行合併爲三元'acc [curr] === undefined? acc [curr] = 1:acc [curr] + 1;' – jboothe

+0

@jboothe好點!我也在考慮三元制,但想出了一個稍微更緊湊的解決方案,您怎麼看? –

+0

漂亮。 undefined + 1或1. – jboothe

0

您可以試試Array.prototype.forEach()。而不是使用數組,您可以使用對象。這將節省您循環查找特定狀態的次數。

arr1 = [ 
 
    {'task':'do something 1', 'status':'done'} , 
 
    {'task':'do something 2', 'status':'done'} , 
 
    {'task':'do something 3', 'status':'pending'} , 
 
    {'task':'do something 4', 'status':'done'} 
 
]; 
 

 
var result = {}; 
 
arr1.forEach(function(item){ 
 
    if(!result[item.status]) 
 
    result[item.status] = 0; 
 
    
 
    result[item.status]++; 
 
}); 
 
console.log(result);

0

由於要存儲輸出值作爲數組應檢查渡過密鑰狀態存在或不存在。如果現在增加它的價值。

arr2 = []; 
arr1.forEach(function(item){ 
    var keyPresent = false; 
    for(var i = 0, len = arr2.length; i < len; i++) { 
     if(arr2[ i ].key === item.status){ 
     keyPresent = true; 
     arr2[ i ].value++ 
     } 
    } 
    if(!keyPresent){ 
    arr2.push({key: item.status , value : 1}) 
} 

通過

arr2 = [ 
    {key:'done', value: 3}, 
    {key:'pending', value: 1} 
];