使用没有对象包装器的 Jquery $.grep 过滤对象数组

Posted

技术标签:

【中文标题】使用没有对象包装器的 Jquery $.grep 过滤对象数组【英文标题】:Filtering an Array of Objects using Jquery $.grep without an Object Wrapper 【发布时间】: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

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

【问题讨论】:

【参考方案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);
                
            );
        );

【讨论】:

以上是关于使用没有对象包装器的 Jquery $.grep 过滤对象数组的主要内容,如果未能解决你的问题,请参考以下文章

jQuery复习—包装集

Jquery 循环 - 在不破坏缩略图分页器的情况下将图像包装在 div 标签中

如何将 @FetchRequest 属性包装器的新 nsPredicate 动态属性与传递给 View 的对象一起使用

使用没有数据库包装器的 PHP 记录 mysql 查询

javascript: 一个可以代替jquery选择器的方法

使用 MediaInfo 加上包装器的 Python 错误