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/
我很确定这是一个简单而有点愚蠢的事情,但我一直找不到答案。
提前致谢!
您正在向 1
st 索引处的数组中推送一个元素。因此,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;
}
这是我的第一个问题,经过多年的阅读,所以请对我好一点。
我在 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/
我很确定这是一个简单而有点愚蠢的事情,但我一直找不到答案。
提前致谢!
您正在向 1
st 索引处的数组中推送一个元素。因此,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;
}