首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少对象数组,并避免覆盖字符串属性值和只覆盖和整数值?

如何减少对象数组,并避免覆盖字符串属性值和只覆盖和整数值?
EN

Stack Overflow用户
提问于 2016-06-21 09:49:07
回答 2查看 1.7K关注 0票数 3

我有一个按不同类别分组的数组,每个类别都嵌套了更多具有不同值(数值和字符串)的对象,我必须减少这些对象(字符串除外)。Reduce是很好的数字值,使它们之和,但它覆盖字符串值,只保留最后一个。

我试图按类别减少一个对象/字典,并用每个类别的单位之和填充一个表,但如果子类别和名称不同,则不要与它们相加。

下面是一个演示:

代码语言:javascript
复制
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)
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

单位(整数)加起来很好,但字符串被最后一个迭代字符串属性覆盖。

我想得到这样的结果,如果字符串不同,整数就不会加起来。

代码语言:javascript
复制
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'
    }
  ]
}

做这件事最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-21 10:02:09

最后,这个提议使用一个对象作为对result对象的项的引用。

如果没有可用的result对象,那么它就会创建一个新的对象,其中包含想要的类别。对于子类别,它生成一个元素,该元素被推送到结果数组。

计数是用hash作为对result元素的引用来维护的。

代码语言:javascript
复制
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);

票数 5
EN

Stack Overflow用户

发布于 2016-06-28 04:43:11

我想这也是答案。

代码语言:javascript
复制
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 result = {};

Object.keys(data).forEach(function (key) {
	var hash = {};
	data[key].forEach(function (v, k) {
		isNaN(hash[(k = v.subcategory + v.name)]) ?
			(hash[k] = this.push(v) - 1) :
			(this[hash[k]].units += v.units);
	}, (this[key] = []));
}, result);

console.log(result)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37941029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档