【问题标题】:How to merge an array of arrays with duplicate at index 0 into one array javascriptjavascript - 如何将索引为0的重复数组合并到一个数组中
【发布时间】:2019-11-23 21:06:23
【问题描述】:

我有一个数组的数组,其日期在索引 0 处。我很想检查是否循环遍历数组以及任何与另一个匹配的日期,这些值应该合并到。

这是数组的样子,也是我尝试过的......

var array = [
  [
    Date 2019-06-11T10:00:00.000Z,
    0,
    0,
    0,
    23
  ],
  [
    Date 019-06-11T10:00:00.000Z,
    0,
    0,
    2,
    0
  ],
  [
   Date 2019-16-11T12:00:00.000Z,
    0,
    56,
    0,
    0
  ],
  [
    Date 2019-16-11T12:00:00.000Z,
    3,
    0,
    0,
    0
  ]
]

var result = array.filter(function(v) {
  return this[v[0]] ?
    !Object.assign(this[v[0]], v) :
    (this[v[0]] = v)
}, []);
console.log(result);

我希望输出是这样的,但该方法似乎删除了重复项。

var array = [[
  Date  2019-06-11T10:00:00.000Z,
    0,
    0,
    2,
    23
  ],[
   Date 2019-16-11T12:00:00.000Z,
    3,
    56,
    0,
    0
  ]]

an image of what the data looks like on the browser console

【问题讨论】:

    标签: javascript arrays duplicates array-merge


    【解决方案1】:

    您可以使用 findIndex 来检查累加器是否已经有新数组的 0 索引,如果有,则合并数组:

    const arr = [['2019-06-11T10:00:00.000Z', 0, 0, 0, 23], ['2019-06-11T10:00:00.000Z', 0, 0, 2, 0], ['2019-16-11T12:00:00.000Z', 0, 56, 0, 0], ['2019-16-11T12:00:00.000Z', 3, 0, 0, 0]]
    
    const sorted = arr.reduce((acc, a) => {
      const index = acc.findIndex(b => a[0] === b[0])
      index > -1 ? acc[index] = acc[index].map((b, i) => i ? b + a[i]: b) : acc.push(a)
      return acc
    }, [])
    
    console.log(sorted)

    【讨论】:

      【解决方案2】:

      对象的快速方法。

      var array = [[new Date('2019-06-11T10:00:00.000Z'), 0, 0, 0, 23], [new Date('2019-06-11T10:00:00.000Z'), 0, 0, 2, 0], [new Date('2019-06-16T12:00:00.000Z'), 0, 56, 0, 0], [new Date('2019-06-16T12:00:00.000Z'), 3, 0, 0, 0]],
          hash = {},
          i, j,
          result,
          item,
          key;
      
      for (i = 0; i < array.length; i++) {
          item = array[i];
          key = item[0].toString();
          if (!hash[key]) {
              hash[key] = item.slice();
              continue;
          }
          for (j = 1; j < item.length; j++) hash[key][j] += item[j];
      }
      
      result = Object.values(hash);
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 不要粗鲁,但我不确定该解决方案是否可行。它显然有效,但 A 不可读导致 B,问题作者不会通过复制粘贴答案来提高他的技能。所以我想我们会再次得到同样的问题。请不要误会我的意思,我看到你为 SO 做了很多质量很好的事情。这是我脑子里突然冒出来的东西。
      • 如果日期是字符串值"2016-08-26T00:00:00Z",这似乎有效。问题是日期索引是 javascript 日期。 i.stack.imgur.com/VMVBK.png 。它不起作用。
      • 您可以使用toString 方法进行检查:a[0].toString() === b[0].toString() 返回一个可比较的字符串。
      • 太慢了,尤其是在处理超过 5000 个数组数据时。
      • 不错。我看到你修改了解决方案。谢谢。唯一的问题是我希望日期值作为日期。我在图表上绘制数据,它不需要字符串值。
      【解决方案3】:

      嗯,在每个合并操作中需要考虑很多条件,但是您可以使用Array.some()Array.filter()Array.map() 方法的组合,并使用以下方法:

      let result = [];
      array.forEach((a, i) => {
        if (!result.some(x => x[0] == a[0])) {
          let found = array.filter((x, j) => {
            return i != j && x[0] == a[0];
          });
          if (found.length > 0) {
            a = a.map((e, ind) => {
              if (ind > 0)
                found.forEach(f => {
                  e += f[ind];
                });
              return e;
            });
          }
          result.push(a);
        }
      });
      

      演示:

      var array = [
        [
          '2019-06-11T10:00:00.000Z',
          0,
          0,
          0,
          23
        ],
        [
          '2019-06-11T10:00:00.000Z',
          0,
          0,
          2,
          0
        ],
        [
          '2019-16-11T12:00:00.000Z',
          0,
          56,
          0,
          0
        ],
        [
          '2019-16-11T12:00:00.000Z',
          3,
          0,
          0,
          0
        ]
      ];
      
      let result = [];
      
      array.forEach((a, i) => {
        if (!result.some(x => x[0] == a[0])) {
          let found = array.filter((x, j) => {
            return i != j && x[0] == a[0];
          });
          if (found.length > 0) {
            a = a.map((e, ind) => {
              if (ind > 0)
                found.forEach(f => {
                  e += f[ind];
                });
              return e;
            });
          }
          result.push(a);
        }
      });
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        相关资源
        最近更新 更多