是否更好地检查JS数组中是否存在元素,还是添加它然后运行_.uniq?

时间:2017-03-06 10:31:34

标签: javascript arrays underscore.js

假设您有一组唯一值,并希望从另一个符合条件的数组中推送新元素,而不会创建重复项。 E.g。

newArray.forEach(function(element){
  if (condition) {
    oldArray.push(element);
  }
})

关于Javascript中的性能,最好在循环的每次迭代中检查元素是否在推送到数组之前已经存在,或者添加满足条件的所有元素,然后运行_。 unicore来自underscore.js?

newArray.forEach(function(element){
  if (condition && !oldArray.includes(element)) {
    oldArray.push(element);
  }
})

newArray.forEach(function(element){
  if (condition) {
    oldArray.push(element);
  }
})
oldArray = _.uniq(oldArray);

也许它对小型项目(和数组)没有什么影响,但我想知道什么是大型项目的最佳选择。

2 个答案:

答案 0 :(得分:1)

_.uniq(oldArray);

将执行数组的另一个循环,因此假设数组由数千个元素组成,第一个解决方案肯定更好。

可能更有用的是使用indexOf代替includes,事实上,在包含功能indexOf之内:

newArray.forEach(function(element){
  if (condition && oldArray.indexOf(element)===-1) {
    oldArray.push(element);
  }
})

你怎么看,包括prototipe是:

String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };

答案 1 :(得分:0)

一个优雅的解决方案是不使用数组而是使用对象。使用键和值相同或您的值作为键,值为“true”作为值:

{
  "value":"value"
}

{
  "value": true
}

当你正在使用它时。当您需要键数组时,使用“for(p in obj)”转换为数组。

这样,默认情况下,数组中的操作是唯一的,无需额外的工作,只返回数组使用一些计算。

如果你使用下划线或lodash,你也可以使用_.keys(obj)。