javascript 如果单元在数组中重复,则返回索引

z9smfwbn  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(127)

我想在下面的排序数组每个单位的重复索引。
单元39索引1索引3重复,对吗?

const array = [

  {
    unit: 38,
  },
  
  {
    unit: 39,
  },

  {
    unit: 39,
  },
  
  {
    unit: 39,
  },
  
  {
    unit: 40,
  },
  
  {
    unit: 41,
  },
  
  {
    unit: 41,
  },
  
  {
    unit: 42,
  },
]

因此,期望的结果将是:

[
  {
    unit: 39,
    fromIndex: 1,
    toIndex: 3,
  },
  
  {
    unit: 41,
    fromIndex: 5,
    toIndex: 6,
  },
]

我试着记住每对单元的索引,但这个想法不适用于超过两次的重复。所以我想我需要一只手

let u;

for (let i = 0; i < array.length; i++) {

  const a = array[i];
  const b = array[i + 1] || {
    unit: null
  };

  if (a.unit == b.unit) {
    u = a.unit; // remmeber the repeated unit here
    ...
  }

}
sshcrbum

sshcrbum1#

您可以检查最新的项目或在结果中的最后一项。

const
    array = [{ unit: 38 }, { unit: 39 }, { unit: 39 }, { unit: 39 }, { unit: 40 }, { unit: 41 }, { unit: 41 }, { unit: 42 }],
    result = array.reduce((r, { unit }, i, a) => {
        if (unit !== a[i - 1]?.unit) return r;
        if (unit !== r[r.length - 1]?.unit) r.push({ unit, fromIndex: i - 1, toIndex: i });
        else r[r.length - 1].toIndex = i;
        return r;
    }, []);

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

siv3szwd2#

可以使用数组reduce和filter方法:

const result = array.reduce((acc, item, index) => {
  if (index > 0 && array[index - 1].unit === item.unit) {
    const last = acc[acc.length - 1];
    last.toIndex = index;
  } else {
    acc.push({
      unit: item.unit,
      fromIndex: index,
      toIndex: index
    });
  }
  return acc;
}, []).filter(item => item.fromIndex !== item.toIndex);

相关问题