【问题标题】:How comparing object item elements in an array with reduce?如何将数组中的对象项元素与reduce进行比较?
【发布时间】:2021-04-25 21:11:45
【问题描述】:

我有数组

 const example = [{ day: 5, month: 1, key: 1 },{ day: 5, month: 1, key: 2 },{ day: 3, month: 3, key: 3 },{ day: 5, month: 1, key: 4 },{ day: 3, month: 3, key: 5 },{ day: 11, month: 4, key: 6 }];

当日月元素相同时如何查看?如果年份和月份重复我希望结果返回

{err:'the same',index:[0,1,2,3]}

我的代码不起作用。

const duplicates = Object.entries(array).reduce((acc, item, index) => {
  if (acc[1].year === item[1].year && acc[1].month === item[1].month) {
    return [
      {
        index:[acc[0],acc[1]],
        err: "the same"
      }
    ];
  }
return acc;});

【问题讨论】:

    标签: javascript arrays algorithm object reduce


    【解决方案1】:
    • 使用Array#reduce 对数组进行迭代,以获取Map 作为key,并将其出现索引作为value
    • 使用Array#filter,获取具有多个索引的条目。
    • 之后,使用Array#map 返回列表。

    const array = [ { day: 5, month: 1, key: 1 }, { day: 5, month: 1, key: 2 }, { day: 3, month: 3, key: 3 }, { day: 5, month: 1, key: 4 }, { day: 3, month: 3, key: 5 }, { day: 11, month: 4, key: 6 } ];
    
    const duplicates = [...array
    .reduce((map, { day, month }, index) => {
      const key = `${day}-${month}`;
      map.set(key, [...(map.get(key) || []), index]);
      return map;
    }, new Map)
    .values()]
    .filter(indices => indices.length > 1)
    .map(indices => ({ err: "the same", index: indices }));
    
    console.log(duplicates);

    【讨论】:

      【解决方案2】:

      我将使用Map 构造函数来构建一个由(唯一)年月值作为键的映射,其中关联的值是错误对象的数组,并使用空的index 数组进行初始化。然后填充那些index 数组,并获取具有多个条目的那些。这里不涉及reduce

      const example = [{ day: 5, month: 1, key: 1 },{ day: 5, month: 1, key: 2 },{ day: 3, month: 3, key: 3 },{ day: 5, month: 1, key: 4 },{ day: 3, month: 3, key: 5 },{ day: 11, month: 4, key: 6 }];
      
      const map = new Map(example.map(o => 
          [o.month * 100 + o.day, {err: "the same", index: []}]
      ));
      example.forEach((o, i) => map.get(o.month * 100 + o.day).index.push(i));
      const dupes = Array.from(map.values()).filter(o => o.index.length > 1);
      console.log(dupes);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        相关资源
        最近更新 更多