当前位置:  开发笔记 > 编程语言 > 正文

下划线地图对象

如何解决《下划线地图对象》经验,为你挑选了1个好方法。

我整天都在努力解决这个问题.

我有以下数组:

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()

然后发生的是它返回一个数组,包含多个带有我的值的对象的数组.现在我的问题是我似乎无法组合所有返回的数组.

有任何想法吗?请?



1> Mr. Polywhir..:

您可以将对象数组转换为按公共键分组的值数组.

然后,您可以将值映射到结果对象.

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; }
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有