【问题标题】:Get the unique values from two arrays and put them in another array [duplicate]从两个数组中获取唯一值并将它们放在另一个数组中[重复]
【发布时间】:2013-04-01 12:12:32
【问题描述】:

我在 javascript 中有两个数组 -:

var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];

我需要一种方法来从两个数组中获取唯一值并将它们放入 array3 Array3 应该是 -:

var array3 = ['1','100'];

感谢您的帮助。

【问题讨论】:

  • 请查看 underscore.js 文档。该库提供了许多对象和数组实用程序,并且可以在客户端和服务器端使用。

标签: javascript arrays


【解决方案1】:
var array3 = array1.filter(function(obj) { return array2.indexOf(obj) == -1; });

Array#filter 上的 MDN:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

包含适用于旧版浏览器的 polyfill。

【讨论】:

  • 很好的答案布雷特。非常感谢
  • 这会导致 o(n^2) 复杂度,在处理大型数组时会变得非常慢。
  • 但希望我不会有这么大的数组导致 o(n^2) 复杂度。谢谢
  • 如果array2中有任何值在array1中不存在,则不会显示。例如 var array1 = [1,3,5,7,9]; var array2 = [1,2,3,5,100];将导致 [7, 9] 而不是 [2,7,9,100]
  • 你也需要反过来检查。这个答案不正确。
【解决方案2】:

借助一点 ES6 的魔力,它可以相当简洁。请注意,我们需要检查两种方式,以防任一数组中存在唯一项。

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [1, 3, 8];

let unique1 = arr1.filter((o) => arr2.indexOf(o) === -1);
let unique2 = arr2.filter((o) => arr1.indexOf(o) === -1);

const unique = unique1.concat(unique2);

console.log(unique);
// >> [2, 4, 5, 8]

【讨论】:

  • 如果arr2 包含唯一编号,则不会添加到unique
  • @curly_brackets - 谢谢,已编辑!现在不是那么简洁,可能有一种更简洁的方式来做到这一点,但至少可读性很好。
【解决方案3】:
var unique = [];
for(var i = 0; i < array1.length; i++){
    var found = false;

    for(var j = 0; j < array2.length; j++){ // j < is missed;
     if(array1[i] == array2[j]){
      found = true;
      break; 
    }
   }
   if(found == false){
   unique.push(array1[i]);
  }
}

更新 原帖可以工作但不是很快,这个实现要快很多,这个例子只使用一个数组,但在函数中你可以很容易地传递任何额外的数组来组合。

只完成了一个简单的错误检查,并且应该进行更多检查,自行决定使用,仅作为工作示例。

function Unique(array) {
var tmp = [];
var result = [];

if (array !== undefined /* any additional error checking */ ) {
  for (var i = 0; i < array.length; i++) {
    var val = array[i];

    if (tmp[val] === undefined) {
       tmp[val] = true;
       result.push(val);
     }

    }
  }

  return result;
}

var unique = Unique([1, 2, 2, 6, 8, 5, 6, 8]);

另外,这可以实现为 Array 对象的原型,将签名更改为

Array.prototype.Unique = function() {
    var array = this;
    ...
}

并且可以这样调用:

var unique = [1, 2, 2, 6, 8, 5, 6, 8].Unique();

【讨论】:

  • 我这样做了,但是我的代码很慢。有没有最优的方法?
  • @SterlingDiaz 如果您的值都是正数,是的,您可以通过将值用作另一个数组中的索引来优化它,因此只有设置的值是唯一的
【解决方案4】:

类似的东西

var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];
var o = {};
for(var i in array1) {
    o[i] = 1;
}
for(var i in array2) {
    o[i] = 0;
}
var array3 = [];
for(var i in o) {
    if(o[i] == 1) {
        array3.push(i);
    }
}

【讨论】:

  • 这里有一个更通用的答案:stackoverflow.com/questions/8628059/…
  • 如果数组 1 具有数组 2 没有的唯一值,则不起作用。
  • 是的。我的解决方案不是对称的。最初的问题并不完全清楚这是否是一项要求。
【解决方案5】:
var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];


var newArr,temp,temp1;


    temp=array1.filter(function(el) 
              {
                return arr2.indexOf(el) == -1; 

              });

    temp1=array2.filter(function(el) 
              {
                return arr1.indexOf(el) == -1; 

              });

  newArr=temp.concat(temp1);


  return newArr;

}

【讨论】:

    【解决方案6】:

    与上面类似,但可以处理两个以上的数组

    var array1 = ['12','1','10','19','100'];
    var array2 = ['12','10','19'];
    var i = 0;
    var hist = {};
    var array3 = [];
    
    buildhist(array1);
    buildhist(array2);
    
    for (i in hist) {
        if (hist[i] === 1) {
            array3.push(i);
        }
    }
    
    console.log(array3);
    
    function buildhist(arr) {
        var i;
        for (i = arr.length - 1; i >= 0; i--) {
            if (hist[arr[i]] === undefined) {
                hist[arr[i]] = 0;
            }
            hist[arr[i]]++;
        }
    }
    

    【讨论】:

      【解决方案7】:
      var array3 = array1.concat(array2);
      
      array3 = array3.sort(function(a, b) { return a > b; });
      array3 = array3.filter(function(num, index) { return num !== array3[index + 1]; });
      

      array3 将只有唯一值

      这也可以在两个循环中完成工作,这很便宜,应该注意 sort() 和 filter() 是 ECMA5 函数,在旧浏览器中不受支持,而且我通常使用像下划线这样的库,所以我不'没有为我工作的每个项目重写这些函数,下划线有一个 .unique() 方法,它显然是更少的代码,更清楚地说明了操作的意图

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 2017-02-16
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多