首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件JS的数组操作

基于条件JS的数组操作
EN

Stack Overflow用户
提问于 2018-11-27 04:04:26
回答 2查看 57关注 0票数 1

我有以下数组

代码语言:javascript
复制
0: {productid: "001", containersize: "20", ContCount: 10}
1: {productid: "002", containersize: "20", ContCount: 9}
2: {productid: "001", containersize: "40", ContCount: 4}
3: {productid: "001", containersize: "20", ContCount: 20}
4: {productid: "003", containersize: "20", ContCount: 18}
5: {productid: "001", containersize: "40", ContCount: 7}
6: {productid: "003", containersize: "40", ContCount: 25}

基于这个数组,我想创建一个新的数组,如下所示:

代码语言:javascript
复制
0: {productid: "001", containersize20: 30, containersize40: 11, total: 41}
1: {productid: "002", containersize20: 9, containersize40: 0, total: 9}
2: {productid: "003", containersize20: 18, containersize40: 25, total: 43}

基本上,根据产品类型和容器大小20和40来计算所有容器。

我使用了以下代码:

代码语言:javascript
复制
var group_to_values = data.reduce(function (obj, item) {
            obj[item.productid] = obj[item.productid] || [];
            obj[item.productid].push(item.ContCount);
            return obj;
        }, {});

        var groups = Object.keys(group_to_values).map(function (key) {
            return {productid: key, ContCount: group_to_values[key]};
        });

但从现在起我一直在思考如何走得更远。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-27 04:15:09

这是一个完美的适合reduce。迭代结构,构建一个根据您的规范映射到键的结果对象,然后取值数组:

代码语言:javascript
复制
const data = [
  {productid: "001", containersize: "20", ContCount: 10},
  {productid: "002", containersize: "20", ContCount: 9},
  {productid: "001", containersize: "40", ContCount: 4},
  {productid: "001", containersize: "20", ContCount: 20},
  {productid: "003", containersize: "20", ContCount: 18},
  {productid: "001", containersize: "40", ContCount: 7},
  {productid: "003", containersize: "40", ContCount: 25}
];

const res = Object.values(data.reduce((a, e) => {
  if (!(e.productid in a)) {
    a[e.productid] = {
      productid: e.productid, 
      containersize20: 0,
      containersize40: 0,
      total: 0
    };
  }
  
  a[e.productid].containersize20 += e.containersize === "20" ? e.ContCount : 0;
  a[e.productid].containersize40 += e.containersize === "40" ? e.ContCount : 0;
  a[e.productid].total += e.ContCount;
  return a;
}, {}));

console.log(res);

票数 2
EN

Stack Overflow用户

发布于 2018-11-27 04:09:15

您在正确的轨道上,但您可以在单个.reduce中将其实现为一个由productid索引的对象,然后您可以获取该对象的值以将其再次转换为一个数组。不要忘记将containersize字符串转换为一个数字,这样您就可以正确地添加:

代码语言:javascript
复制
const input = [
  {productid: "001", containersize: "20", ContCount: 10},
  {productid: "002", containersize: "20", ContCount: 9},
  {productid: "001", containersize: "40", ContCount: 4},
  {productid: "001", containersize: "20", ContCount: 20},
  {productid: "003", containersize: "20", ContCount: 18},
  {productid: "001", containersize: "40", ContCount: 7},
  {productid: "003", containersize: "40", ContCount: 25}
];
const output = Object.values(input.reduce((a, { productid, containersize, ContCount }) => {
  if (!a[productid]) a[productid] = {
    productid,
    total: 0,
    containersize20: 0,
    containersize40: 0,
  };
  a[productid]['containersize' + containersize] += ContCount;
  a[productid].total += ContCount;
  return a;
}, {}));
console.log(output);

请注意,所有这些都不是jQuery,这只是简单的内置Javascript,它通常可以实现与jQuery一样的功能。

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

https://stackoverflow.com/questions/53492576

复制
相关文章

相似问题

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