Javascript 检查JS数组中是否存在元素,或者添加元素然后运行q.uniq,这样更好吗?

Javascript 检查JS数组中是否存在元素,或者添加元素然后运行q.uniq,这样更好吗?,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,假设您有一个唯一值的数组,并且希望从另一个数组中推送满足条件的新元素,而不创建重复项。例如 newArray.forEach(function(element){ if (condition) { oldArray.push(element); } }) 关于Javascript的性能,在循环的每次迭代中,在推送到数组之前检查元素是否已经存在,或者添加满足条件的所有元素,然后从underline.js运行uq.uniq,这样更好吗 newArray.forEach(functi

假设您有一个唯一值的数组,并且希望从另一个数组中推送满足条件的新元素,而不创建重复项。例如

newArray.forEach(function(element){
  if (condition) {
    oldArray.push(element);
  }
})
关于Javascript的性能,在循环的每次迭代中,在推送到数组之前检查元素是否已经存在,或者添加满足条件的所有元素,然后从underline.js运行uq.uniq,这样更好吗

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

newArray.forEach(function(element){
  if (condition) {
    oldArray.push(element);
  }
})
oldArray = _.uniq(oldArray);
也许这对小项目(和阵列)没有什么影响,但我想知道什么最适合大型项目

_.uniq(oldArray);
将执行数组的另一个循环,因此假设数组由数千个元素组成,第一个解决方案肯定更好

可能更有用的方法是使用
indexOf
而不是
includes
,实际上,在includes函数中,会生成
indexOf

newArray.forEach(function(element){
  if (condition && oldArray.indexOf(element)===-1) {
    oldArray.push(element);
  }
})
您可以看到,includes协议是:

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;
    }
  };

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

{
  "value":"value"
}

当你使用它的时候。当您需要密钥数组时,使用“for(p in obj)”将其转换为数组

这样,数组中的操作在默认情况下是唯一的,不需要额外的工作,并且只有返回数组时才会使用一些计算


如果您使用的是下划线或lodash,那么您也可以使用u.keys(obj)。

OP没有说它们的值有键来标识它们。这就是为什么我建议将值用作键的原因。啊。该死,更正了我的答案。谢谢你的提示。好的,但这仍然假设它们是字符串(或者可以可靠地表示为字符串)。好的观点。可以使用元素中的标识符(id或类似项)作为键,使用对象作为值,也可以使用u.values(obj)。)您可以将数组转换为
Set
对象,并安全地执行添加操作,如
mySet.add(“whetever”)
Set
对象应该可以满足您的许多需求,但是如果您需要减少或映射,您可以像
[…mySet]那样引用它。减少((p,c)=>)
。谢谢@Redu我将查看集合。这是一个有效的观点,Bruno先生,但是下划线.js运行的任何优化如何?@tany4这是真的,但是如果你使用for和uniq,你总是会生成更多的循环,而不是只使用第一个for
{
  "value": true
}