使用for / in循环的javascript过滤器?

时间:2013-11-29 17:22:38

标签: javascript arrays

是否可以过滤javascript数组?我采取了以下方法,但它似乎没有产生预期的结果。

阵列

var catalog1 = [0]
var catalog2 = [1]
var products = [{ id: "PRODUCTA", desc: "Toys" },
                { id: "PRODUCTB", desc: "Cars" }]

过滤

var NewProducts = [];
for (r in catalog1) NewProducts.push(products[r]);

NewProducts应包含产品A或B,具体取决于所选的目录数组。我的尝试总是返回产品A,如r = 0.我缺少什么?

http://jsfiddle.net/rE52f/

2 个答案:

答案 0 :(得分:2)

这是因为每个循环的Javascript都会生成集合的键。您必须将其更改为:

for (var r in someCatalogue) NewProducts.push(products[someCatalogue[r]]);

如果你不需要支持IE8及更少的话,你也可以在闭包内使用map:

(function(products) {
  NewProducts = someCatalogue.map(function(item) { return products[item]; });
})(products);

答案 1 :(得分:1)

可以过滤JavaScript数组,只需使用filter方法:

var arr = [1, 2, 3, 4, 5, 6];
var result = arr.filter(function(item) {
        return item > 3;
    }
);

在您的情况下,您尝试过滤products数组以包含某些元素,因此要以正确的方式执行此操作:

var catalog1 = [0];
var catalog2 = [1];
var products = [{ id: "PRODUCTA", desc: "Toys" },
            { id: "PRODUCTB", desc: "Cars" }];

var NewProducts = products.filter( function(item) {
        // check item and if it is accepted then include it.
    }
);

在你的代码中,你使用for / in来循环数组元素,这不是走向数组的正确方法,使用常规for循环:

var NewProducts = [];
for (var i=0; i<catalog1.length; i++) NewProducts.push(products[catalog1[i]]);