首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ES6重构JSON对象

使用ES6重构JSON对象
EN

Stack Overflow用户
提问于 2018-06-22 15:49:54
回答 4查看 746关注 0票数 1

我有这样的东西:

代码语言:javascript
运行
复制
tires: [{
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct2",
  quantity: 1
}];

我想要完成的是

代码语言:javascript
运行
复制
tires: [{
  name: "fancyProduct1",
  quantity: 3
}, {
  name: "fancyProduct2",
  quantity: 1
}]

有什么最好的方法来解决这个问题吗?

EN

回答 4

Stack Overflow用户

发布于 2018-06-22 15:59:31

可以使用reduce将数组分组为一个对象。使用Object.values将对象转换为数组。

代码语言:javascript
运行
复制
let tires = [{"name":"fancyProduct1","quantity":1},{"name":"fancyProduct1","quantity":1},{"name":"fancyProduct1","quantity":1},{"name":"fancyProduct2","quantity":1}];

let result = Object.values(tires.reduce((c, {name,quantity}) => {
  c[name] = c[name] || {name,quantity: 0}
  c[name].quantity += quantity;
  return c;
}, {}));

console.log(result);

票数 4
EN

Stack Overflow用户

发布于 2018-06-22 16:01:14

使用Reduce可以做到这一点:

代码语言:javascript
运行
复制
var products = { tires: [ {name: "fancyProduct1", quantity: 1}, {name: "fancyProduct1", quantity: 1}, {name: "fancyProduct1", quantity: 1}, {name: "fancyProduct2", quantity: 1}] };

var result = products.tires.reduce((acc,current) => {

    if (!acc[current.name]) {
       acc[current.name] = { name: current.name, quantity: 0};
    }

    acc[current.name].quantity++;

    return acc;
}, {});

var resultArray = Object.values(result);
console.log(resultArray);
票数 1
EN

Stack Overflow用户

发布于 2018-06-22 16:04:49

您可以使用一个简单的Array.forEach()调用来遍历array项,并使用Array.find()检查result数组中是否存在已迭代的item,并相应地执行逻辑。

你的代码应该是这样的:

代码语言:javascript
运行
复制
var result = [];

tires.forEach(function(el) {
  let found = result.find(o => o.name === el.name);
  if (found) {
    found["quantity"] += el["quantity"];
  } else {
    result.push(el);
  }
});

演示:

代码语言:javascript
运行
复制
var tires = [{
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct1",
  quantity: 1
}, {
  name: "fancyProduct2",
  quantity: 1
}];

var result = [];

tires.forEach(function(el) {
  let found = result.find(o => o.name === el.name);
  if (found) {
    found["quantity"] += el["quantity"];
  } else {
    result.push(el);
  }
});

console.log(result);

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

https://stackoverflow.com/questions/50983171

复制
相关文章

相似问题

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