Javascript JS数组声明中的空元素

Javascript JS数组声明中的空元素,javascript,jquery,arrays,declaration,Javascript,Jquery,Arrays,Declaration,这是我在这里的第一个问题,我已经读了很多年了,所以请对我好一点 我在js/jq中的阵列管理方面遇到了问题 我有一个包含多个元素的数组,每个元素用$处理。 我想将匹配元素提取到另一个数组并返回此数组。 但出于某种原因(不知道是否是因为数组声明,jquery.each函数…),我有了第一个空元素 我想我让这比它更难理解,所以我做了JSFIDLE var arr = new Array(); $.each([1,2,3], function(index,element){ if (elemen

这是我在这里的第一个问题,我已经读了很多年了,所以请对我好一点

我在js/jq中的阵列管理方面遇到了问题

我有一个包含多个元素的数组,每个元素用$处理。 我想将匹配元素提取到另一个数组并返回此数组。 但出于某种原因(不知道是否是因为数组声明,jquery.each函数…),我有了第一个空元素

我想我让这比它更难理解,所以我做了JSFIDLE

var arr = new Array();
$.each([1,2,3], function(index,element){
    if (element == 2){
        arr[index] = element;
    }
});
arr必须只有1个元素,但arr.length返回2,因为第一个数组插槽为空

这是一把小提琴

我确信这是一件简单而愚蠢的事情,但我一直没能找到答案


提前谢谢

您正在将数组中的一个元素推送到
1
st索引处。因此,javascript默认将
undefined
放在
0
th索引中

因此,在每个的末尾,您的数组将

[undefined, 2];
这就是将
长度
设置为2的原因

您可以使用
push
在数组中添加元素:

$.each([1, 2, 3], function (index, element) {
    if (element == 2) {
        arr.push(element);
        elem++;
    }
});
演示:

方法将一个或多个元素添加到数组的末尾,并返回数组的新长度


文档:

最佳解决方案:使用
.filter

var arr = [1, 2, 3].filter(function(value){
    return value == 2
});
如果返回值为true,则返回的数组中包含该元素,否则将忽略该元素。这是纯js,因此不需要jquery。请参阅有关的文档

您的问题:使用
.push

var arr = [1, 2, 3].filter(function(value){
    return value == 2
});
尝试在阵列上使用
.push
方法(请参阅)

.push
方法将随着元素的添加动态增加数组

您的问题是,函数中的
index
值是初始数组中的一个参考点。这意味着,如果查看返回的数组,您将发现
[undefined,2]
,因此长度返回为2。如果您的条件是
element==3
,您将有两个空插槽

或者:使用
.grep

var arr = [1, 2, 3].filter(function(value){
    return value == 2
});
另一个jQuery方法是
$.grep
。看

这是jQuery对javascript的
.filter
的实现

[1, 2, 3]

if (element == 2)

arr[index] = element;  
这意味着您正在将arr[1]设置为元素

如果要按顺序将其添加到arr(正常填充),请将其推入art


arr.push(元素)

您的数组
[1,2,3]
有三个元素和三个关联索引:0,1和2。在
$的每次迭代中。each()
在该数组上循环,索引及其值将传递给函数

因此,第一个调用将
0,1
作为其参数传递。第二个调用将
1,2
作为其参数传递,然后
if
语句条件的计算结果为true,因此您的代码:

arr[index] = element;
实际上相当于

arr[1] = 2;
由于要在索引1处插入一个元素,因此最终将得到一个空索引0

您只需使用将元素添加到数组中:

arr.push(element);

如前所述,问题是在索引1处赋值,因此数组的长度将被视为2

一种解决方案是使用.push()而不是基于索引进行赋值

另一种方法是,如果元素与条件匹配,则使用并返回true

var arr = [1, 2, 3].filter(function(value){
    return value == 2
});
演示:


使用


好像你在找


非常感谢。我知道stackoverflow工作得很好,但不是很好!我对数组和json对象(我正在使用)感到困惑,没有想到数组索引从0开始。现在一切都清楚了。我一直在考虑使用数组是否是最好的方法。最后,我将使用对象,像arr={}一样声明arr。对于对象,我可以毫无问题地拥有像[1,4,5,6]这样的索引。谢谢你的回答!
var arr = [1, 2, 3].filter(function(value){
    return value == 2
});
var elems = ["car", "bike"];
var arr = [1, 2, 3, "car", 5, "bike"].filter(myFilterFunc);

function myFilterFunc(val) {
    if (elems.indexOf(val) > -1) return true;
}