筛选数组以具有唯一值
Filter array to have unique values
我需要过滤掉我的数组以仅包含唯一值。这是我的数组数据
["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"]
预期结果应为
["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8", "X_row9"]
我应该如何继续我的代码以获得正确的结果。
newArray = [];
for(n in data){
if(!newArray.indexOf(n)){
newArray.push(n);
}
}
console.log(newArray);
如果您需要任何其他信息,请告诉我,我会提供。
您可以使用 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 );
警告:正如 rob 在评论中指出的那样,此方法应避免使用非常大的数组,因为它在 O(N^2)
中运行。
更新 (2017年11月16日(
如果您可以依赖 ES6 功能,那么您可以使用 Set 对象和 Spread 运算符从给定数组创建一个唯一的数组,如下面 Heeter @Travis答案中所述:
var uniqueArray = [...new Set(array)]
自 2015 年 6 月 15 日起,您可以使用 Set()
创建一个唯一的数组:
var uniqueArray = [...new Set(array)]
对于您的示例:
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"]
使用 JavaScript Set 和 Array.from 方法可以过滤数组以包含唯一值,如下所示:
Array.from(new Set(arrayOfNonUniqueValues));
设置
Set 对象允许您存储任何类型的唯一值,无论 基元值或对象引用。
返回值 一个新的 Set 对象。
Array.from((
Array.from(( 方法从 类数组或可迭代对象。
返回值 一个新的数组实例。
示例代码:
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);
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}`)
您可以使用哈希表进行查找和筛选所有未包含的值。
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);
Array.prototype.unique = function () {
return [...new Set(this)]
}
然后我们可以写:
const arr = [1, 5, 2, 2, 2, 3, 4, 3, 2, 1, 5]
const uniqueArr = arr.unique()
您可以使用"地图和展开"运算符:
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);
我所知,这是针对es2015
及以上。ES6
有"更干净"的选项,但这是一个很好的方法(使用 TypeScript
(。
let values: any[] = [];
const distinct = (value: any, index: any, self: any) => {
return self.indexOf(value) === index;
};
values = values.filter(distinct);
reduce
循环数组并获取不重复的值。还使用辅助object
来获取附加值的计数。
var aux = {};
var newArray = ["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"].reduce((tot, curr)=>{
if(!aux[curr]){
aux[curr] = 1;
tot.push(curr);
}
return tot;
}, []);
console.log(newArray);
如果需要过滤多个数组,则indexOf
方法略有不同:
function unique(item, index, array) {
return array.indexOf(item) == index;
}
这样使用:
arr.filter(unique);
我一直使用:
unique = (arr) => arr.filter((item, i, s) => s.lastIndexOf(item) == i);
但最近我必须获得以下各项的唯一值:
["1", 1, "2", 2, "3", 3]
而且我的旧备用没有削减它,所以我想出了这个:
uunique = (arr) => Object.keys(Object.assign({}, ...arr.map(a=>({[a]:true}))));
- 如何从数组中查找唯一对象
- JavaScript:从对象数组中获取唯一值及其计数
- 创建具有2个唯一数字的Javascript数组
- javascript和具有唯一密钥的es6过滤器数组
- 根据对多个数组唯一的元素创建一个新数组
- 将数组中的重复项转换为唯一项,而不删除Javascript中的任何项
- 映射对象数组,并且仅采用唯一
- Ember JS如何获取具有唯一属性值的数组
- 如何使 JSON 数组唯一
- Javascript:编写一个函数,接收一个数组,然后返回一个只有唯一数字的数组,只删除数组
- 从数组列表中返回唯一的数组
- 推送时请确保数组中的值是唯一的
- 对具有唯一值的对象键的数组进行排序
- 基于两个属性从 javascript 中的对象数组中获取唯一数组
- Javascript:如何将对象数组转换为具有排序唯一数组的对象
- 合并并返回唯一数组问题
- 日期的唯一数组
- Javascript唯一数组项
- 以最有效的方法查找唯一数组
- 在Javascript中迭代地声明唯一数组