假设您有一组唯一值,并希望从另一个符合条件的数组中推送新元素,而不会创建重复项。 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);
也许它对小型项目(和数组)没有什么影响,但我想知道什么是大型项目的最佳选择。
答案 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)。