2017-07-01 101 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