过滤掉数组以仅包含唯一值

Val*_*or_ 18 javascript arrays

我需要过滤掉我的数组以仅包含唯一值.这是我的数组数据

["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是

["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8", "X_row9"]
Run Code Online (Sandbox Code Playgroud)

我应该如何继续我的代码才能获得正确的结果.

newArray = [];
for(n in data){
  if(!newArray.indexOf(n)){
     newArray.push(n);
  }
}
console.log(newArray);
Run Code Online (Sandbox Code Playgroud)

如果您需要任何其他信息,请告诉我,我会提供.谢谢

Moh*_*waj 54

您可以使用Array.filter函数根据回调函数的返回值过滤掉数组的元素.回调函数针对原始数组的每个元素运行.

这里回调函数的逻辑是,如果indexOf当前项的值与索引相同,则表示首次遇到该元素,因此可以将其视为唯一.如果不是,则表示已经遇到该元素,因此现在应该将其丢弃.

var arr = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"];

var filteredArray = arr.filter(function(item, pos){
  return arr.indexOf(item)== pos; 
});

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

更新(2017年11月16日)

如果您可以依赖ES6功能,那么您可以使用Set objectSpread运算符从给定数组创建一个唯一数组,如下面@Travis Heeter的答案中所述:

var uniqueArray = [...new Set(array)]
Run Code Online (Sandbox Code Playgroud)


Tra*_*ter 18

截至2015年6月15日,您可以使用Set()创建一个独特的数组:

var uniqueArray = [...new Set(array)]
Run Code Online (Sandbox Code Playgroud)

对于你的例子:

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]
var newArray = [...new Set(data)]
console.log(newArray)

>> ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]
Run Code Online (Sandbox Code Playgroud)


JSO*_*C11 9

可以使用JavaScript SetArray.from方法来过滤包含唯一值的数组,如下所示:

Array.from(new Set(arrayOfNonUniqueValues));

Set对象使您可以存储任何类型的唯一值,无论是原始值还是对象引用。

返回值一个新的Set对象。

Array.from()

Array.from()方法从类似于数组或可迭代对象的对象创建一个新的Array实例。

返回值一个新的Array实例。

示例代码:

const array = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]

const uniqueArray = Array.from(new Set(array));

console.log("uniqueArray: ", uniqueArray);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 8

您可以使用哈希表进行查找并过滤所有未包含的值.

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"],
    unique = data.filter(function (a) {
        return !this[a] && (this[a] = true);
    }, Object.create(null));

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


小智 7

arr = ["I", "do", "love", "JavaScript", "and", "I", "also", "do", "love", "Java"];

uniqueArr = [... new Set(arr)];

// or

reallyUniqueArr = arr.filter((item, pos, ar) => ar.indexOf(item) === pos)

console.log(`${uniqueArr}\n${reallyUniqueArr}`)
Run Code Online (Sandbox Code Playgroud)


Mor*_*ani 5

您可以使用Map and Spread Operator

var rawData = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"];

var unique = new Map();
rawData.forEach(d => unique.set(d, d));
var uniqueItems = [...unique.keys()];

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


Zuh*_*aha 5

Array.prototype.unique = function () {
  return [...new Set(this)]
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以写:

const arr = [1, 5, 2, 2, 2, 3, 4, 3, 2, 1, 5]
const uniqueArr = arr.unique()
Run Code Online (Sandbox Code Playgroud)

  • 因为当你使用箭头函数时,`this` 引用的是 `window`,而当你使用普通函数时,`this` 引用的是数组。 (2认同)