从Array中删除重复元素 - Javascript(No JQuery& ECMAScript)

时间:2017-11-12 10:04:20

标签: javascript jquery arrays

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

我不想将所有数组连接成一个数组,并使用唯一方法来过滤掉。我需要在迭代期间创建唯一的数组。

前:

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]
Output must be [1,2,3,4,5,6,7,8,9,10,11,12]

P.S:我可以连接数组并使用jquery唯一函数来解决这个问题,但我需要一个单独的javascript解决方案。感谢

7 个答案:

答案 0 :(得分:2)

您可以使用array#reduce展平您的数组,然后使用Set获取不同的值,并使用array#fromSet获取数组。



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(new Set(arr.reduce((r,a) => r.concat(a))));
console.log(result);




答案 1 :(得分:1)

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

int *const *pp = &p;

答案 2 :(得分:0)

使用EMTrackPoint回答:

for element in objectsArray {
    let item = EMTrackPoint(latitude: element.latitude, longitude: element.longitude)
    item.mElevation = element.ele
    item.mOrientation = element.orientation
    item.mDate = Date()
    ...

ES6答案:

Sets

怎么回事?

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

  

Set对象允许您存储任何类型的唯一值,无论是否   原始值或对象引用。

因此,当我们初始化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); 将数组传递给构造函数时,我们基本上确保没有重复的值。

然后在最后一行中,我们将之前初始化的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. 连接到最终集合中。

Sets表示法将Sets转换为...,当我们将4个数组传递给Set的构造函数时,它们会连接起来{{1}创建了他们唯一的值。

答案 3 :(得分:0)

这是用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,箭头功能可以使代码更短。

答案 4 :(得分:0)

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

function uniques(arr) {
    var obj = {}, result = [];
    for (var i = 0; i < arr.length; i++) {
        obj[arr[i]] = true;
    }
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) result.push(+prop);
    }
    return result;
}

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

var result = uniques(a.concat(b, c, d));

console.log('Result: ' + result);

由于对象只能拥有一组唯一的属性(无重复),因此将所有数组值用作对象中的属性将为您提供一个对象,该对象具有每个唯一值的属性。这发生在第一个循环中。注意:给予这些房产的价值无关紧要;我使用过true

然后结果就是将这些属性转换回数组值。这发生在第二个循环中。

答案 5 :(得分:0)

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 result = a.concat(b,c,d);
function remvDup(result){
    var tmp = [];
    for(var i = 0; i < result.length; i++){
        if(tmp.indexOf(result[i]) == -1){
        tmp.push(result[i]);
        }
    }
    return tmp;
}
console.log(remvDup(result));

答案 6 :(得分:0)

因为OP提到他不能使用&#39; Set&#39;因为目标浏览器不支持,我建议使用lodash库中的void Button_Click(object sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is TabItem item) { var tabControl = (TabControl)item.Parent; tabControl.Items.Remove(item); } } 函数。

See union's documentation here