使用Jquery $ .grep过滤对象数组而不使用Object Wrapper

时间:2011-12-15 13:50:57

标签: javascript jquery filtering

过滤适用于包围对象数组的对象(data):

var arr = {"data":
 [
  {"name":"Alan","height":"171","weight":"66"},
  {"name":"Ben","height":"182","weight":"90"},
  {"name":"Chris","height":"163","weight":"71"}
 ]
};

var new_arr = $.extend(true, arr);

new_arr.data = $.grep(new_arr.data, function(n, i){
  return n.weight > 70;
});

alert(new_arr.data.length); // answer is 2

但是,没有对象包装器的过滤不会。

var arr = [
  {"name":"Alan","height":"171","weight":"66"},
  {"name":"Ben","height":"182","weight":"90"},
  {"name":"Chris","height":"163","weight":"71"}
 ];

var new_arr = $.extend(true, arr);

new_arr = $.grep(new_arr, function(n, i){
  return n.weight > 70;
});

alert(new_arr.length); // answer is 1 instead of 2

我不确定问题出在哪里。任何人都可以指出。谢谢!

2 个答案:

答案 0 :(得分:10)

您错误地使用了extend。您无法使用数组扩展new_arr。 Extend会将方法/道具添加到一个对象,但它在运行到你的数组时会创建哪些方法/道具?这就是它与对象包装器一起工作的原因:1)extend期望一个对象,2)'data'是一个可以添加到new_arry的属性。

尽管如此,在你的第二个例子中,看起来你不需要扩展任何东西。这有用吗?

new_arr = $.grep(arr, function(n, i){ // just use arr
  return n.weight > 70;
});

答案 1 :(得分:1)

您可以将其用于更深层的对象

var prodIds = [];

        $.grep(this.prodOrders, function (n, i) { 

            $.grep(n.ProductionOrderLines, function (n2, i2) { 
                if (n2.ItemNo == resource) {
                    prodIds.push(n2.DocumentAbsoluteEntry);
                }
            });
        });