【问题标题】:Filtering an Array of Objects using Jquery $.grep without an Object Wrapper使用没有对象包装器的 Jquery $.grep 过滤对象数组
【发布时间】:2012-01-21 05:02:36
【问题描述】:

过滤适用于环绕对象数组的对象 (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

我不确定问题出在哪里。谁能指出。谢谢!

【问题讨论】:

    标签: javascript jquery filtering


    【解决方案1】:

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

    尽管在您的第二个示例中,您似乎不需要扩展任何内容。这行得通吗?

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

    【讨论】:

    • 我也刚刚找到原因:) 我忘记了为什么我首先使用扩展。看来我现在不需要了。非常感谢:)
    【解决方案2】:

    您可以将它用于更深的对象,

    var prodIds = [];
    
            $.grep(this.prodOrders, function (n, i) { 
    
                $.grep(n.ProductionOrderLines, function (n2, i2) { 
                    if (n2.ItemNo == resource) {
                        prodIds.push(n2.DocumentAbsoluteEntry);
                    }
                });
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      相关资源
      最近更新 更多