2017-07-01 102 views
1

大家好,新的JavaScript,并希望对这个问题,我有一些帮助。基本上我想做的是从我的数组中删除单个对象。该数组包含如下对象:y = [{id:group}].使用变量属性值从javascript数组中删除对象

我想使用对象的ID(第一列)删除一个对象。

我试过的是循环遍历数组来找到相应的id并删除它,但这里的问题是第一列没有标记为“id”,第一列是id形式(例如123) 。

任何帮助,将不胜感激。

y = [{123:1},{321:2},{234:3}] 
id = 123; 

    for (var i = 0; i < y.length; i++) 
    if (y[i].id === id) { 
     y.splice(i,1); 
    } 
//Does not work because the first column of the object is not named "id" 
+1

动态属性名称是巨大的,如果你知道他们要什么,但你不知道。更有用的对象结构是'{id:123,group:1}' – James

+0

@James接受了您的建议并决定重新创建我的对象结构。这里的解决方案不再工作,但现在数组更容易处理。谢谢! – user3702643

回答

2

只是检查是否存在某些关键:

for (var i = 0; i < y.length; i++) 
    if (key in y[i]) { 
    y.splice(i,1); 
    } 
} 
+0

我最终确定使用循环方法,因为性能更好,即使过滤器方法看起来更干净,它对我来说也更有意义。谢谢! – user3702643

4

可以使用filter,而不是一个循环:

var y = [{123:1},{321:2},{234:3}] 
 
var id = 123; 
 

 
y = y.filter((obj) => !obj.hasOwnProperty(id)); 
 

 
console.log(y);

+0

谢谢!这工作得很好。你能告诉我与使用循环相比使用过滤器有什么好处吗? – user3702643

+0

@user 3702643其语法糖。使用循环速度更快,不会重新创建阵列...... –

+0

性能大致相同,代码变得更具可读性。另一个优点是它的功能方面,因为你可以将过滤后的数组分配给另一个变量,没有副作用 –

1

我提出用两个参数的函数(数组,对象的关键) 在数组中使用forEach方法我检查并比较给定键的key(通过参数)和对象元素中的existen键。如果它是true,那么我使用splice()方法删除包含键的对象:

y = [{123:1},{321:2},{234:3}]; 
 

 
function deleteObj(arg,value){ 
 
    arg.forEach(function(element){  
 
    var index=arg.indexOf(element);  
 
    if(Object.keys(element)==value.toString()){ 
 
     arg.splice(index,1); 
 
    } 
 
    }); 
 
} 
 
deleteObj(y,123); 
 

 
console.log(y);

+0

谢谢你的替代方法! – user3702643