2017-01-20 98 views
3

我一整天都在爲這個問題苦苦掙扎。下劃線地圖對象

我有以下數組:

controller.array = [{ 
    Equity: "0", 
    Bond: "97.42", 
    Cash: "67.98" 
}, { 
    Equity: "5.32", 
    Bond: "13.12", 
    Cash: "8" 
}, { 
    // ... 
} /* ... */ ] 

我想要做的就是創建一個包含對象與組合值,像這樣一個數組:

controller.newArray = [{ 
    Type: "Equity", 
    Percentage: "5.32" 
}, { 
    Type: "Bond", 
    Percentage: "110.54" 
}, { 
    Type: "Cash", 
    Percentage: "75.98" 
} /* ... */ ] 

我一直在使用_.each這樣的嘗試:

.map(function(item, value) { 
    var array = []; 
    _.each(item, function(value, item) { 
     array.push({ 
     'Source': item, 
     'Percentage': value 
     }) 
    }) 
    return array; 
    }) 
    .value() 

然後發生的是它返回一個數組,其中包含mu ltiple數組與對象與我的價值觀。現在我的問題是,我似乎不能合併所有正在返回的數組。

任何想法?請?

+0

您能提供最小,完整和可驗證示例(http://stackoverflow.com/help/mcve)。使用可運行的代碼片段。 – ppasler

+1

我相信他的問題非常清楚@ppasler--他不是要求一個問題的幫助,而是更多的如何解決問題。他希望將第一個數組(多個對象用「Equity」,「Bond」和「Cash」屬性)轉換爲第二個數組。 –

+0

@JamesMonger我不清楚,如果提供了一個運行示例,我總是喜歡它。沒有人必須讓它成爲一個運行的例子。 – ppasler

回答

5

您可以對象的數組轉成他們的公共密鑰分組值的數組。

然後,您可以將值映射到生成的對象。

transpose()sum()函數是下劃線的mixins,所以你可以鏈接它們!

_.mixin({ 
 
    transpose : function(array) { 
 
    return _.chain(array).map(_.keys).flatten().uniq().reduce(function(result, key) { 
 
     result[key] = _.pluck(array, key); 
 
     return result; 
 
    }, {}).value(); 
 
    }, 
 
    sum : function(values) { 
 
    return _.reduce(values, function(sum, value) { 
 
     return sum + (_.isNumber(value) ? value : parseFloat(value)); 
 
    }, 0); 
 
    } 
 
}); 
 

 
var array = [{ 
 
    Equity: "0", 
 
    Bond: "97.42", 
 
    Cash: "67.98" 
 
}, { 
 
    Equity: "5.32", 
 
    Bond: "13.12", 
 
    Cash: "8" 
 
}]; 
 

 
var result = _.chain(array).transpose().map(function(value, key) { 
 
    return { 
 
    Type: key, 
 
    Percentage: _.sum(value).toFixed(2) 
 
    }; 
 
}).value(); 
 

 
console.log(JSON.stringify(result, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

0

如果你需要的是總結每種類型那麼這應該這樣做:

keys = {Equity: 0, Bond: 0, Cash: 0} 
//newArray is the array from your question 
newArray.forEach(function(obj) { 
    keys[obj.Type] += obj.Percentage}) 
2

的一種方法,只用JavaScript的可能是使用mapreduce功能:

var data = [{Equity: "0", Bond: "97.42", Cash: "67.98"}, 
 
      {Equity: "5.32", Bond: "13.12", Cash: "8"}]; 
 

 
var sumMap = data.reduce(function(acc, item) { 
 
    Object.keys(item).forEach(function(itemKey) { 
 
    if (acc[itemKey] === undefined) { 
 
     acc[itemKey] = 0; 
 
    } 
 
    acc[itemKey] += parseFloat(item[itemKey]); 
 
    }); 
 
    return acc; 
 
}, {}); 
 
var result = Object.keys(sumMap).map(function(itemKey) { 
 
    return { 
 
    "Type": itemKey, 
 
    "Percentage": "" + sumMap[itemKey] 
 
    }; 
 
}); 
 

 
console.log(JSON.stringify(result, null, 2));

中間結果sumMap會是這樣的:

{ 
    Equity: 5.32, 
    Bond: 110.54, 
    Cash: 75.98 
} 

fiddle(感謝CPHPython)。

+0

不錯的香草解決方案,但您可能想使用parseFloat,這裏是[fiddle](https://jsfiddle.net/jL4y36cd/)(首先打開控制檯測試)。糾正答案,添加一個正在運行的代碼片段,我會贊成。 – CPHPython

+0

謝謝! :)哈哈,我不知道爲什麼我使用'parseInt',很好! :) – andrusieczko