我整天都在努力解决这个问题.
我有以下数组:
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()
然后发生的是它返回一个数组,包含多个带有我的值的对象的数组.现在我的问题是我似乎无法组合所有返回的数组.
有任何想法吗?请?
您可以将对象数组转换为按公共键分组的值数组.
然后,您可以将值映射到结果对象.
该transpose()
和sum()
功能是下划线的混入,这样你就可以把它们连!
_.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; }