如何从Array创建Set并删除JavaScript中的原始项

Luc*_*coy 6 javascript arrays set ecmascript-6

我有一个重复值的数组.

我想创建一个Set来获取该数组的不同值,并删除或创建一个新的Array,它将具有相同的数据MINUS创建Set所需的元素.

这不仅仅是删除重复项,而是删除原始数组中每个不同值的SINGLE条目

这样的东西有效,但我想知道是否有更直接的方法:

let originalValues = [
  'a',
  'a',
  'a',
  'b',
  'b',
  'c',
  'c',
  'd'
];

let distinct = new Set(originalValues);
/*
distinct -> { 'a', 'b', 'c', 'd' }
*/

// Perhaps originalValues.extract(distinct) ??
for (let val of distinct.values()) {
  const index = originalValues.indexOf(val);
  originalValues.splice(index, 1);
}

/* 
originalValues -> [
  'a',
  'a',
  'b',
  'c'
];
*/
Run Code Online (Sandbox Code Playgroud)

Ori*_*ori 5

使用Array#filter与组合Set:

const originalValues = ['a', 'a', 'a', 'b', 'b', 'c',  'c', 'd'];

const remainingValues = originalValues.filter(function(val) {
  if (this.has(val)) { // if the Set has the value
    this.delete(val); // remove it from the Set
    return false; // filter it out
  }

  return true;
}, new Set(originalValues));



console.log(remainingValues);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 3

您可以对 a 使用闭包Set并检查是否存在。

let originalValues = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd'],
    result = originalValues.filter((s => a => s.has(a) || !s.add(a))(new Set));

console.log(result);
Run Code Online (Sandbox Code Playgroud)