如何减少一个对象数组,避免覆盖字符串属性值,只是求和整数值?

时间:2016-06-21 09:49:08

标签: javascript arrays json

我有一个按不同类别分组的数组,每个类别都嵌套了更多具有不同值(数字和字符串)的对象,我必须减少它们(字符串除外)。 Reduce工作正常,使用数值来计算它们的总和,但它会覆盖保留最后一个的字符串值。

我正在尝试按类别缩小对象/字典,并使用每个类别的单位总和填充表格,但如果子类别和名称不同,则不要求它们。

这是一个演示:

var data = {
  'Category xxxx': [
    {
      units: 1234,
      subcategory: 'wolves',
      name: 'Starks'
    },
    {
      units: 1345354,
      subcategory: 'wolves',
      name: 'Starks'
    },
   {
      units: 666,
      subcategory: 'dragons',
      name: 'Targaryens'
    }
  ], 
  'Category yyyy': [
    {
      units: 7783,
      subcategory: 'lions',
      name: 'Lanisters'
    },
    {
      units: 1267878,
      subcategory: 'spires',
      name: 'Martells'
    }
  ]
}

var test = _.map(data, function (value, key) {
  var returnedData = {
    Category: key,
    units: _(value).reduce(function (memo, metrics) {
      return memo + metrics.units;
    }, 0),
    subcategory: _(value).reduce(function (memo, metrics) {
      return metrics.subcategory;
    }, 0),
    name: _(value).reduce(function (memo, metrics) {
      return metrics.name;
    }, 0),
  };
  return returnedData;
});

console.log(test)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

单位(整数)正好相加但字符串被最后一个迭代的字符串属性覆盖。

我想获得这样的东西,如果字符串不同,则不会加起来整数。

returnedData = {
  'Category xxxx': [
    {
      units: 1346588,
      chivalry: 'wolves',
      name: 'Starks'
    },
    {
      units: 666,
      subcategory: 'dragons',
      name: 'Targaryens'
    }
  ], 
  'Category yyyy': [
    {
      clicks: 7783,
      subcategory: 'lions',
      name: 'Lanisters'
    },
    {
      clicks: 1267878,
      subcategory: 'spires',
      name: 'Martells'
    }
  ]
}

最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

最后,此提案使用对象作为result对象项的引用。

如果没有result对象可用,则会创建一个具有所需类别的新对象。对于子类别,它会生成一个推送到结果数组的元素。

使用hash维护计数作为result

元素的参考

&#13;
&#13;
var data = { 'Category xxxx': [{ clicks: 1234, subcategory: 'dogs', name: 'jhon doe' }, { clicks: 1345354, subcategory: 'dogs', name: 'jhon doe' }], 'Category yyyy': [{ clicks: 7783, subcategory: 'frogs', name: 'lanisters' }, { clicks: 1267878, subcategory: 'rats', name: 'perry' }] },
    result = {};

Object.keys(data).forEach(function (k) {
    var hash = Object.create(null);
    if (!result[k]) {
        result[k] = [];
    }
    data[k].forEach(function (a) {
        if (!hash[a.subcategory]) {
            hash[a.subcategory] = { clicks: 0, subcategory: a.subcategory, name: a.name };
            result[k].push(hash[a.subcategory]);
        }
        hash[a.subcategory].clicks += a.clicks;
    });
});

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我认为这也可能是答案。

WorldStage