最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Underscore Map Object - Stack Overflow

programmeradmin1浏览0评论

I have been struggling with this problem the whole day.

I have got the following array:

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

What I want to do is create a single array containing objects with bined values like so:

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

I have tried using _.each like this:

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

What then happens is that it returns an array, containing multiple arrays with objects with my values. Now my problem is that I cant seem to bine all the arrays that are being returned.

Any ideas? Please?

I have been struggling with this problem the whole day.

I have got the following array:

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

What I want to do is create a single array containing objects with bined values like so:

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

I have tried using _.each like this:

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

What then happens is that it returns an array, containing multiple arrays with objects with my values. Now my problem is that I cant seem to bine all the arrays that are being returned.

Any ideas? Please?

Share Improve this question edited Jan 20, 2017 at 11:55 Mr. Polywhirl 48.9k12 gold badges93 silver badges145 bronze badges asked Jan 20, 2017 at 11:51 manneJan89manneJan89 1,0249 silver badges28 bronze badges 3
  • Could you provide Minimal, Complete, and Verifiable example (stackoverflow./help/mcve). Use the runnable code snippet. – ppasler Commented Jan 20, 2017 at 11:55
  • 1 I believe his question is perfectly clear @ppasler - he's not asking for help with an issue but more on how to solve them. He wants to turn the first array (multiple objects with Equity, Bond and Cash properties) into the second array. – James Monger Commented Jan 20, 2017 at 12:09
  • @JamesMonger it wasn't clear to me and I always like it if a running example is provided. No others have to make it a running example. – ppasler Commented Jan 20, 2017 at 12:11
Add a ment  | 

3 Answers 3

Reset to default 5

You can transpose the array of objects into an array of values grouped by their mon key.

Then you can map the values over to the resulting objects.

The transpose() and sum() functions are underscore mixins, so you can chain them!

_.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./ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

One way, using only JavaScript could be to use map and reduce functions:

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

The intermediate result sumMap will be something like this:

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

The fiddle (thanks to CPHPython).

If what you need is to sum each type then this should do:

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

评论列表(0)

  1. 暂无评论