我不知道如何做到这一点,但我想做的是创建一个数组,并能够向这个数组添加新项目。由于这些项应该是一个随机数,所以当创建一个新实例时,我希望它与数组的其余部分进行检查,并确保它生成的数字不在数组中。我将如何完成这样的事情?
我看了ŠimeVidas的回答,似乎有效,但我试图将其缩短为
var arr = [];
function add(a) {
var n = ~~(Math.random() * 100);
for (var i = 0; i < a.length; i++) {
if ( a[i] === n) { a.push(n) }
}
}
for (var i=0; i<5; i++){
add(arr)
}
document.getElementById('output').innerHTML += arr;
我不明白为什么这不起作用。它几乎完全相同,对吗?
答案 0 :(得分:5)
var arr = [];
function add(a) {
var n = ~~(Math.random() * 1000);
!is(a, n) && a.push(n);
}
function is(a, n) {
for (var i = 0; i < a.length; i++) {
if ( a[i] === n ) { return true; }
}
return false;
}
add
函数创建一个0到1000之间的随机整数,并将其添加到数组中
is
函数检查n
数字是否在a
数组中的某个位置。
演示: http://jsfiddle.net/kHhMp/2/
演示2: http://jsfiddle.net/kHhMp/3/
(演示2显示一个数字只会添加到数组中,如果它尚未包含在数组中。)
顺便说一句
!is(a, n) && a.push(n);
是这方面的简短形式:
if ( is(a, n) == false ) { a.push(n); }
仅当is(a, n)
返回false时,才会将数字添加到数组中。
<强>更新强>
var arr = [];
function add(a) {
var n = ~~(Math.random() * 1000),
ok = true;
for (var i = 0; i < a.length; i++) {
if ( a[i] === n ) { ok = false; }
}
ok && a.push(n);
}
答案 1 :(得分:2)
如果您喜欢快速代码并且阵列中有许多项目,则应使用Object而不是Array。
不要使用var my_array=[]; my_array.push(my_number)
,而是使用var my_object = {}; my_object[my_number] = true
在您的结构中添加项目。
通过这种方法,您可以使用if (my_object[my_number]) { /* already there */ } else { /* not there yet */ }
完成后,您可以使用var keys = Object.keys(my_object)
,或者如果不可用,var keys=[],i=0;for (keys[i++] in my_object);
,或多或少,将数字列表提取为数组。
答案 2 :(得分:1)
var array = []
array[0] = 'Item'
array[0] === undefined
# returns false
array[1] === undefined
# returns true
答案 3 :(得分:1)
最快,最跨浏览的方式是使用循环迭代数组:
var arr = [];
function addNum(num) {
for (i = 0, len = arr.length; i < len; i++) {
if ( arr[i] === num ) { return false; }
}
arr.push(num);
}
确保在运行循环之前获取数组的长度,以便不经常检查length属性。
答案 4 :(得分:1)
您可以根据需要扩展内置的Array
对象。
Array.prototype.pushUnique = function(value) {
var len = this.length;
for(var i = 0; i < len; i++) {
if(this[i]===value) return;
}
this.push(value);
}
var uniques = new Array();
uniques.pushUnique(1);
uniques.pushUnique(2);
uniques.pushUnique(1);
// array will contain only 1 and 2