javascript - 对象数组,条件满足时更改为新结构

标签 javascript arrays

给定以下数组:我想按时间戳对所有内容进行分组,并根据如果subGroup满足,则对real求和主组。请参阅下面我想要的结果...

var arr = [
  {
    mainGroup: 'A',
    subGroup: 'B',
    real: 100,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'A',
    subGroup: 'C',
    real: 150,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'B',
    subGroup: 'D',
    real: 123,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'B',
    subGroup: 'Y',
    real: 542,
    timestamp: '2017-01-15T01:00:00.000Z'
  }
]

结果将是:

[
  {
    A: 250, // 250 is sub B real + sub C real.
    B: 665, // 665 is sub D real + sub Y real.
    timestamp: '2017-01-15T01:00:00.000Z'
  },
]

到目前为止我的代码:

var arr = [
  {
    mainGroup: 'A',
    subGroup: 'B',
    real: 100,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'A',
    subGroup: 'C',
    real: 150,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'B',
    subGroup: 'D',
    real: 123,
    timestamp: '2017-01-15T01:00:00.000Z'
  },
  {
    mainGroup: 'B',
    subGroup: 'Y',
    real: 542,
    timestamp: '2017-01-15T01:00:00.000Z'
  }
]

let b = arr.reduce((a, item) => {
  a[item.timestamp] = a[item.timestamp] || {};

  Object.assign(a[item.timestamp], {
    [item.mainGroup]: item.real
  });

  return a;
}, {});

Object.keys(b)
    .map(timestamp => Object.assign(b[timestamp], { timestamp }));

console.log(b)

最佳答案

您可以使用对象来引用组。

Array#forEach

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
    grouped = [];

array.forEach(function (a) {
    if (!this[a.timestamp]) {
        this[a.timestamp] = { timestamp: a.timestamp };
        grouped.push(this[a.timestamp]);
    }
    this[a.timestamp][a.mainGroup] = (this[a.timestamp][a.mainGroup] || 0) + a.real;
}, Object.create(null));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Array#reduce

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
    grouped = array.reduce(function (hash) {
        return function (r, a) {
            if (!hash[a.timestamp]) {
                hash[a.timestamp] = { timestamp: a.timestamp };
                r.push(hash[a.timestamp]);
            }
            hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real;
            return r;
        };
    }(Object.create(null)), []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6 带有 Array#reduce

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }],
    grouped = array.reduce((hash => (r, a) => {
        if (!hash[a.timestamp]) {
            hash[a.timestamp] = { timestamp: a.timestamp };
            r.push(hash[a.timestamp]);
        }
        hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real;
        return r;
    })(Object.create(null)), []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 对象数组,条件满足时更改为新结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666020/

相关文章:

javascript - JavaScript 中的 %(jscode)s 是什么意思?

javascript - 顶级绑定(bind)上的输入更改事件监听器

c - PIL 逊系数计算数组

Java:复制非原始类型的数组

javascript - 循环跳过 Mongo 数据库中的记录

javascript - 在单页应用程序中加载和卸载资源

python - 值错误: can only convert an array of size 1 to a Python scalar for Numpy Select

创建一个大小为 N 的数组,然后为每个元素分配值 "[ ]"

javascript - grunt build 出现 "Broken @import"错误?

arrays - Julia:我可以在 for 循环的迭代中更新和存储相同的数组吗?