JS数组声明中的空元素

Empty elements in JS array declaration

这是我的第一个问题,经过多年的阅读,所以请对我好一点。

我在 js/jq 中遇到数组管理问题。

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

我想我让这比现在更难理解,所以制作了 jsfiddle.

var arr = new Array();
$.each([1,2,3], function(index,element){
    if (element == 2){
        arr[index] = element;
    }
});

arr 必须只有 1 个元素,但是 arr.length returns 2 因为第一个数组槽是空的。

这是一个fiddlehttp://jsfiddle.net/moay7y95/

我很确定这是一个简单而有点愚蠢的事情,但我一直找不到答案。

提前致谢!

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

因此,在 each 结束时,您的数组将是

[undefined, 2];

这就是您将 length 设为 2 的原因。

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

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

演示:https://jsfiddle.net/tusharj/moay7y95/2/

The push() method adds one or more elements to the end of an array and returns the new length of the array.

文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push

最佳解决方案:使用.filter

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

如果 return 值为真,则该元素包含在 returned 数组中,否则将被忽略。这是纯js,所以你不需要jquery。请参阅有关 .filter

的文档

你的问题:使用.push

尝试在数组上使用 .push 方法(参见 Mozilla's documentation)。

var arr = new Array();
$.each([1,2,3], function(index,element){
    if (element == 2){
        arr.push(element);
    }
});

.push 方法将在添加元素时动态增长数组。

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

或者:使用.grep

另一个jQuery方法是$.grep。参见 http://api.jquery.com/jquery.grep/

var arr = $.grep([1, 2, 3], function (value) {
    return value == 2
});

这是 jQuery 对 javascript 的 .filter 的实现。

[1, 2, 3]

if (element == 2)

arr[index] = element;  

这意味着您将 arr[1] 设置为元素。

如果要顺序添加到arr中(正常填满),到art

arr.push(element);

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

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

arr[index] = element;

实际上等同于

arr[1] = 2;

由于您要在索引 1 处插入一个元素,因此您最终会得到一个空索引 0。

您可以改为简单地使用 Array.push() 将元素添加到数组中:

arr.push(element);

如前所述,问题是您在索引 1 处分配值,因此该数组将被视为长度为 2。

一种解决方案是使用 .push() 而不是基于索引分配。

另一种方法是使用 Array.filter() 和 return 如果元素匹配条件

则为真
var arr = [1, 2, 3].filter(function(value){
    return value == 2
});

演示:Fiddle


使用$.grep()

var arr = $.grep([1, 2, 3], function (value) {
    return value == 2
});

您似乎在寻找 Array.filter (MDN)

var elems = ["car", "bike"];
var arr = [1, 2, 3, "car", 5, "bike"].filter(myFilterFunc);

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

Fiddle