hay*_*nar 1 javascript arrays for-loop
我有一个数字数组,并在for循环中动态地向该数组添加新数字.但我需要避免添加数组中已存在的值.是否存在JS本机方式来检查数组中是否存在某些值而不执行第二个嵌套循环.我不想使用嵌套循环,因为数组的大小可能会变化到10000
Syr*_*ozZ 13
只需使用includes.
var array1 = [1, 2, 3];
console.log(array1.includes(2)); // true
Run Code Online (Sandbox Code Playgroud)
您可以使用Array.prototype.indexOf大多数浏览器支持的JavaScript本机:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
var a = [1, 2, 3];
console.log(a.indexOf(4)); // -1
Run Code Online (Sandbox Code Playgroud)
indexOf比for-loop更快,但算法的复杂性仍然存在O(n^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);
Run Code Online (Sandbox Code Playgroud)
之后numbersArray仅包含唯一编号。if 测试.hasOwnProperty()是“可选的”,具体取决于您的观点。
在第一个循环中,您可以检查是否numbersObj已经保存currentNumber:
if (!numbersObj[currentNumber])
numbersObj[currentNumber] = true;
Run Code Online (Sandbox Code Playgroud)
或者就像我在第一个代码块中所做的那样,每次都(重写)写它。