我有一个数字数组,并在for循环中动态地向该数组添加新数字。但我需要避免添加数组中已存在的值。是否存在JS本机方式来检查数组中是否存在某些值而不执行第二个嵌套循环。我不想使用嵌套循环,因为数组的大小可能会变化到10000
答案 0 :(得分:6)
您可以使用大多数浏览器支持的JavaScript的原生Array.prototype.indexOf
:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
var a = [1, 2, 3];
console.log(a.indexOf(4)); // -1
indexOf
比for-loop更快,但算法复杂度仍为O(n^2)
。如果数组的大小变得更大,请考虑使用不同的数据结构,例如哈希表。
答案 1 :(得分:2)
使用while循环可以轻松避免for循环。 [暂停笑声......]但严重的是,即使是内置的Array.indexOf()
方法(大多数浏览器都支持)也可能在内部使用循环。
您可以使用普通对象,并将每个数字作为属性添加到对象中,然后从对象中获取值并将它们放在实际数组中(或者如果方便的话,只在对象中使用它们) 。然后你只需要在最后一次循环“最多10000”数字:
var numbersObj = {},
numbersArray = [];
// your existing for statement here
for (var i=0; i<something; i++) {
var currentNumber = somethingElse(); // whatever your existing code is to
// determine the number to add goes here
// put the number in the object (as a key)
numersObj[currentNumber] = true;
}
// copy numbers out of object into array
for (var k in numbersObj)
if (numbersObj.hasOwnProperty(k))
numbersArray.push(k);
之后numbersArray
仅包含唯一数字。 .hasOwnProperty()
的if测试是“可选的”,具体取决于您的观点。
在第一个循环中,您可以检查numbersObj
是否已经拥有currentNumber
:
if (!numbersObj[currentNumber])
numbersObj[currentNumber] = true;
或者像我在第一个代码块中那样每次都写(或者)。
答案 2 :(得分:1)
试试这个,
function eleContainsInArray(arr,element){
if(arr != null && arr.length >0){
for(var i=0;i<arr.length;i++){
if(arr[i] == element)
return true;
}
}
return false;
}
答案 3 :(得分:0)
某些浏览器支持Array.indexOf,您可以使用此代码段来支持所有浏览器
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
答案 4 :(得分:0)
只需使用includes
。
var array1 = [1, 2, 3];
console.log(array1.includes(2)); // true