2014-09-10 55 views
2

这是我的数组中删除元素,如何从一个数组,嵌套对象

arr = [ 
     { 
      'User': { 
       'id':1058, 
       'name':'user67' 
      }, 
      Source: { 
       'dom':'pl-4' 
      } 
     }, 
     { 
      'User': { 
       'id':768, 
       'name':'user13' 
      }, 
      Source: { 
       'dom':'pl-4' 
      } 
     } 
     ]; 

我使用下面的代码删除:

​​

我想删除ID为用户768但它以某种方式不起作用。

如何搜索嵌套对象?

+0

下划线方法重复数组,您需要使用[] .splice()进行变异。 – dandavis 2014-09-10 19:00:28

回答

2

你仍然可以做到在普通的JavaScript:

for (var i = 0; i < arr.length; i++) 
{ 
    if (arr[i].User.id == 768) 
    { 
     arr.splice(i, 1); 
     break; 
    } 
} 

Fiddle

4

使用ES5阵列的方法,

arr = arr.filter(function(item) { 
    return item.User.id !== 768; 
}); 

注意它的短期和明确的,但传统的for循环更快。

+0

什么for循环代码会跑得更快?我的快速测试显示filter()在V8中运行速度快了24倍。由于某些原因,jsPerf和jsFiddle运行速度较慢,但​​是如果您在devtools控制台的http://jsfiddle.net/rndme/p64mpux3/中的代码中运行代码,请在google.com或about:blank上运行,然后filter()要快得多。为什么它在用于测试的两个站点上的运行方式不同于我... – dandavis 2014-09-10 19:20:26

+0

@dandavis ES5数组方法通常比较慢,因为它们在每次迭代时运行一个函数,这有点慢;他们创建一个新的数组而不是修改现有的数组;并且它们迭代所有数组(假设用户标识是唯一的,在找到要删除的数据后不需要继续迭代)。 – Oriol 2014-09-10 20:01:11

+0

这只是在某些情况下,[] .filter是更快的方式。另外,for-in不会跳过稀疏数组,这意味着在某些情况下它可以做更多的工作。如果你想早些放弃函数迭代,或者使用新的[4,6,3,6,8] .findIndex(Object.is.bind(null,6)),你可以将闭包潜入[] .some )== 1 – dandavis 2014-09-10 20:19:05

1

JavaScript有一个很好的数组方法,名为map,它可以映射对象数组的属性。所以,你可以拼接在包含一定的属性选择指数阵列的对象,通过这种方法:

arr.splice(
    arr.map(function(e) { 
     return e["User"]["id"]; 
    }).indexOf(768) 
    ,1 
); 

MDN Array.prototype.map() docs

只要注意它的IE浏览器的兼容性从版本9

0

你可以开始请尝试以下内容

arr= _.reject(arr, function(obj) { 
    return obj.User.id == 768; 
});