2015-08-28 15 views
0

我有一個相當棘手的數據結構,我需要迭代才能生成更簡潔的對象。如何求和一個對象數組中的公共鍵?

lodash(或JavaScript如果更好),是有辦法,採取一切original.day類型和添加他們original.value在一起,然後沒入自己的已知集合,以創建一個新的對象來生成唯一鍵值;

這是我的原始對象,有些項目顯示爲重複項,但值仍然應該添加到相應的日期。

var original = [ 

    { day: 01, value: 0 }, 
    { day: 01, value: 2 }, 

    { day: 02, value: 4 }, 
    { day: 02, value: 1 }, 

    { day: 03, value: 3 }, 
    { day: 03, value: 9 }, 

    { day: 01, value: 0 }, 
    { day: 01, value: 4 }, 

    { day: 02, value: 2 }, 
    { day: 02, value: 0 }, 

    { day: 03, value: 3 }, 
    { day: 03, value: 3 } 

]; 

然後我需要得到以下幾點:

var output = [ 
    { day01: 6 }, 
    { day02: 7 }, 
    { day03: 18 } 
]; 

或:

var output = [ 
    [01,6], 
    [02,7], 
    [03,18] 
]; 

我試圖與lodash許多不同的方法(uniq的,減少,各等...)沒有快樂,也許我沒有使用正確的方法。任何幫助不勝感激。

+0

FYI:你是不是會得到一個前導零與01 – epascarello

+0

你的問題的標題並沒有真正匹配您正在尋找的輸出。您要求的輸出更像是:「在對象數組中加上公共鍵」。你不是「找到」任何「獨特」的東西。 – jfriend00

+0

同意,我更新了標題,謝謝。 – zilj

回答

1

你可以這樣做在純Javascript。創建day01樣式的按鍵只需要幾行代碼。你可以在這裏運行這個片段看到的結果:

function sumDays(list) { 
 
    var result = {}; 
 
    list.forEach(function(item) { 
 
     var dayNum = item.day; 
 
     var dayPrefix = dayNum <= 9 ? "0" : ""; 
 
     var key = "day" + dayPrefix + dayNum; 
 
     if (!result[key]) { 
 
      result[key] = 0; 
 
     } 
 
     result[key] += item.value; 
 
    }); 
 
    return result; 
 
} 
 

 
var original = [ 
 

 
    { day: 01, value: 0 }, 
 
    { day: 01, value: 2 }, 
 

 
    { day: 02, value: 4 }, 
 
    { day: 02, value: 1 }, 
 

 
    { day: 03, value: 3 }, 
 
    { day: 03, value: 9 }, 
 

 
    { day: 01, value: 0 }, 
 
    { day: 01, value: 4 }, 
 

 
    { day: 02, value: 2 }, 
 
    { day: 02, value: 0 }, 
 

 
    { day: 03, value: 3 }, 
 
    { day: 03, value: 3 } 
 

 
]; 
 

 
var r = sumDays(original); 
 
document.write(JSON.stringify(r));

1

與此去解決的最快方法是使用_.reduce爲lodash或Array.prototype.reduce()爲普通的JavaScript。

Lodash

DEMO

function getTotalDays(collection) { 
    return _.reduce(collection, function(result, item) { 
    var index = 'day' + _.padLeft(item.day, 2, 0); 
    result[index] = (result[index] || 0) + item.value; 
    return result; 
    }, {}); 
} 

PLAIN JAVASCRIPT

DEMO

function getTotalDays(collection) { 
    return collection.reduce(function(result, item) { 
    var index = 'day' + (item.day < 10? '0': '') + item.day; 
    result[index] = (result[index] || 0) + item.value; 
    return result; 
    }, {}); 
} 
0

這會給你第二格式[["01",6], ["02",7], ["03",18]]

_.pairs(_.reduce(original, function(output, item) { 
    var day = '0' + item.day; 
    output[day] = (output[day] || 0) + item.value; 
    return output; 
}, {})); 
相關問題