从数组中删除重复元素-Javascript(无JQuery和ECMAScript)

从数组中删除重复元素-Javascript(无JQuery和ECMAScript),javascript,jquery,arrays,Javascript,Jquery,Arrays,案例:我们在一个数组中存储了“n”个数组(数组的数组)。现在,此父数组中的每个子数组都可以包含其他子数组中可能存在或不存在的元素。输出-我需要创建一个数组,其中包含所有子数组中存在的所有元素,不包括重复的元素 我不想将所有数组连接到一个数组中,并使用唯一的方法进行筛选。我需要在迭代期间创建唯一的数组 例: 附言:我可以解析数组并使用jquery独特的函数来解决这个问题,但我需要一个单独使用javascript的解决方案。谢谢尝试使用.filter将每个数组添加到最后一个数组时,过滤掉重复的数组:

案例:我们在一个数组中存储了“n”个数组(数组的数组)。现在,此父数组中的每个子数组都可以包含其他子数组中可能存在或不存在的元素。输出-我需要创建一个数组,其中包含所有子数组中存在的所有元素,不包括重复的元素

我不想将所有数组连接到一个数组中,并使用唯一的方法进行筛选。我需要在迭代期间创建唯一的数组

例:


附言:我可以解析数组并使用jquery独特的函数来解决这个问题,但我需要一个单独使用javascript的解决方案。谢谢

尝试使用.filter将每个数组添加到最后一个数组时,过滤掉重复的数组:

a.filter(function(item) {
    return !finalArray.contains(item));
});

使用
集合回答

var a = [1,2,3,4,5];
var b = [1,2,7,8];
var c = [1,2,3,4,5,6,7,8];
var d = [9,10,11,12];

var concat = a.concat(b).concat(c).concat(d);
var union = new Set(concat);
//console.log(union);
ES6答案:

let a = new Set([1,2,3,4,5]);
let b = new Set([1,2,7,8]);
let c = new Set([1,2,3,4,5,6,7,8]);
let d = new Set([9,10,11,12]);

let arr = new Set([...a,...b,...c,...d]);
//Result in arr.
发生什么事了

发件人:

Set对象允许您存储任何类型的唯一值,无论 基本值或对象引用

因此,当我们初始化
集合
将数组传递给构造函数时,我们基本上确保没有重复的值

然后在最后一行中,我们将之前初始化的所有
集合浓缩成一个最终集合

符号将
集合
转换为
数组
,当我们将4个数组传递给
集合的构造函数时,它们被连接起来,并创建一个
集合

您可以使用
数组#reduce
将数组展平,然后使用
集合
获取不同的值,并使用
数组#from
集合
获取数组

var a=[1,2,3,4,5];
var b=[1,2,7,8];
var c=[1,2,3,4,5,6,7,8];
var d=[9,10,11,12];
var arr=[a,b,c,d]
var result=Array.from(新集合(arr.reduce((r,a)=>r.concat(a)));

控制台日志(结果)这里是一个用ES5编写的功能替代方案

var flatten = function(list) {
  return list.reduce(function(acc, next) {
    return acc.concat(Array.isArray(next) ? flatten(next) : next);
  }, []);
};

var unique = function(list) {
  return list.filter(function(element, index) {
    return list.indexOf(element) === index;
  })
}


var a = [1,2,3,4,5];
var b = [1,2,7,8];
var c = [1,2,3,4,5,6,7,8];
var d = [9,10,11,12];
var arr = [a,b,c,d];

var result = unique(flatten(arr));

console.log(result);

如果您支持ES6,arrow函数可以使代码更短。

这里有一个解决方案,它使用普通对象来解析重复项,并且只使用基本的ES3 JavaScript。在IE 5.5及更高版本中运行,时间复杂度为O(n)

功能唯一性(arr){
var obj={},result=[];
对于(变量i=0;i
var a=[1,2,3,4,5];
var b=[1,2,7,8];
var c=[1,2,3,4,5,6,7,8];
var d=[9,10,11,12];
var结果=a.concat(b,c,d);
函数remvDup(结果){
var tmp=[];
对于(变量i=0;iconsole.log(remvDup(result))因为OP提到他不能使用“Set”,因为目标浏览器不支持它,我建议使用lodash库中的
'union'
函数


你能使用ES6吗?不,只是普通的javascript可能与js不同……ES6也是普通的javascript,只是在不同的规范上。请更新你的答案,解释这里发生了什么。看起来更具可读性和优化性,但IE 8、9、10不支持Set。我的项目需要与IE8+版本兼容。无论如何,谢谢你的建议。你可以尝试为
array#reduce
Set
array#from
添加polyfill。谢谢你的建议,但我的目标是在没有任何库或外部脚本的情况下实现这一点,只需要简单的JS。
var flatten = function(list) {
  return list.reduce(function(acc, next) {
    return acc.concat(Array.isArray(next) ? flatten(next) : next);
  }, []);
};

var unique = function(list) {
  return list.filter(function(element, index) {
    return list.indexOf(element) === index;
  })
}


var a = [1,2,3,4,5];
var b = [1,2,7,8];
var c = [1,2,3,4,5,6,7,8];
var d = [9,10,11,12];
var arr = [a,b,c,d];

var result = unique(flatten(arr));

console.log(result);