这是我的第一个问题,经过多年的阅读,所以请跟我好。
我在js / jq中遇到阵列管理问题。
我有几个元素的数组,用$ .each函数处理。 我想将匹配元素提取到另一个数组并返回此数组。 但由于某种原因(不知道是不是因为数组声明,jquery.each函数...)我有第一个空元素。
我认为我让它比理解起来更难理解,所以制作了jsfiddle。
var arr = new Array();
$.each([1,2,3], function(index,element){
if (element == 2){
arr[index] = element;
}
});
arr必须只有1个元素,但arr.length返回2,因为第一个数组插槽为空。
这是一个小提琴http://jsfiddle.net/moay7y95/
我很确定这是一个简单而愚蠢的事情,但我找不到答案。
提前致谢!
答案 0 :(得分:3)
您正在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/
push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。
文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push
答案 1 :(得分:3)
最佳解决方案:使用.filter
var arr = [1, 2, 3].filter(function(value){
return value == 2
});
如果返回值为true,则该元素将包含在返回的数组中,否则将被忽略。这是纯粹的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
的值是初始数组中的参考点。这意味着如果查看返回的数组,您会发现[undefined, 2]
,因此长度返回为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
的实现。
答案 2 :(得分:2)
您的数组[1, 2, 3]
有三个元素和三个相关索引:0,1和2.在$.each()
循环遍历该数组的每次迭代中,索引及其值传递给函数
所以第一次调用将0, 1
作为参数传递。第二个调用将1, 2
作为参数传递,然后if
语句条件的计算结果为true,因此您的代码为:
arr[index] = element;
实际上相当于
arr[1] = 2;
由于你在索引1处插入一个元素,你最终会得到一个空索引0。
您只需使用Array.push()
将元素添加到数组中:
arr.push(element);
答案 3 :(得分:2)
如前所述,问题是您在索引1处分配值,因此数组将被视为长度为2.
一种解决方案是使用.push()而不是基于索引进行分配。
另一种方法可能是使用Array.filter()并在元素与条件匹配时返回true
var arr = [1, 2, 3].filter(function(value){
return value == 2
});
演示:Fiddle
使用$.grep()
var arr = $.grep([1, 2, 3], function (value) {
return value == 2
});
答案 4 :(得分:0)
[1, 2, 3]
if (element == 2)
arr[index] = element;
这意味着您将arr [1] 设置为元素。
如果你想按顺序将它添加到arr(正常填充),将它添加到艺术中
arr.push(element);
答案 5 :(得分:0)
好像你正在寻找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 强>