2014-08-31 52 views
0

我有幾個陣列,看起來有點像這些:定製指數從數組刪除元素的Javascript

arr['a'] = 'val1'; 
arr['b'] = 'val2'; 
arr['c'] = 'val3'; 

該指數是不是整數,它是一個字符串。我想從陣列中完全刪除arr ['b']。我曾嘗試:

arr.splice('b', 1); 

它不工作,這可能是因爲該指數不是整數,根據 w3schools這就是問題所在「指數 - 需要一個整數。」

一個可能的解決方案可能循環遍歷所有數組,然後用一個整數索引重新創建它們,然後將一個數組作爲值並將等效整數索引作爲其索引。

這似乎是一種不必要的浪費資源,是否有更智能更有效和更簡單的解決方案?

最好是一個arr.splice,它將使用非整數索引。

我已經查看了大量的帖子,涵蓋了如何通過索引和值從數組中刪除元素,但沒有涵蓋如何使用非整數索引刪除元素。

例的帖子,我發現: 0 1 2

任何及所有的幫助感激!

//編輯,以下用作解決方案。

function aObj() { 
    this.a = ""; 
    this.b = []; 
} 

var aObjs = []; 
aObjs.push(new aObj); 
aObjs.push(new aObj); 
aObjs.push(new aObj); 

aObjs[0].a = "val1"; 

aObjs.splice(1, 1); 

看起來有點不同於我在第一個例子中使用的東西,但是這對我的使用方式更加準確。可能不是最好的辦法,但它的工作原理。

+2

JavaScript沒有關聯數組!使用一個對象。 – undefined 2014-08-31 14:13:27

+0

您有使用數組的原因嗎?聽起來像你應該使用一個對象,而不是 – 2014-08-31 14:13:35

+0

好吧......除了我不知道我可以沒有別的原因...我會研究這個。謝謝。 – Daniel 2014-08-31 14:17:02

回答

3

,因爲你使用數組作爲一個字典,它不是不要使用數組string索引,使用對象,如波紋管

var arr = {} //create a object 

arr['a'] = 'val1'; //asign values 
arr['b'] = 'val2'; 
arr['c'] = 'val3'; 

console.log(arr) //prints {a: "val1", b: "val2", c: "val3"} 

delete arr['a'] //delete a key 

console.log(arr) // prints {b: "val2", c: "val3"} 
+0

在閱讀undefined和Nick White的答案後,用它作爲開始,必須重做很多代碼,但可能值得。解決方案更新了問題。 – Daniel 2014-08-31 17:11:37

1

那麼這是行不通的。首先爲此使用對象。第二次使用delete刪除屬性:

var dict = { 'a': 'val1', 'b': 'val2', 'c': 'val3' }; 
delete dict.a; 
1

正如前面所說,這不是一個Array。如果它應該是一個數組,它看起來像這樣

var arr = ['val1', 'val2', 'val3']; 

現在你可以使用Array.splice刪除值'val2'

arr.splice(1,1); 
// or 
arr.splice(arr.indexOf('val2'),1); 
// or even 
arr = arr.filter(function (v){ return v !== 'val2'}); 

如果它應該是一個對象,它的declariation樣子:

var obj = {a: 'val1', b: 'val2', c: 'val3'}; 

如果你想刪除'val2',但不知道它的關鍵,你可以循環:

for (var key in obj) { 
    if (obj[key] === 'val2'; 
    delete obj[key]; 
} 
// or (mis)use Object.keys 
Object.keys(obj) 
     .filter(function(v){ 
       return this[v] === 'val2' ? !(delete this[v]) : true; 
       }, obj); 

知道了這一點,你可以爲對象陣列創建一個輔助方法:

function removeByValue(objOrArr, value) { 
    if (objOrArr instanceof Array && objOrArr.length) { 
    var found = objOrArr.indexOf(value); 
    if (found) { objOrArr.splice(found,1); } 
    } 
    if (objOrArr instanceof Object) { 
    var keys = Object.keys(objOrArr); 
    if (keys.length) { 
     keys.filter(function(v){ 
       return this[v] === value ? !(delete this[v]) : true; 
       }, objOrArr); 
    } 
    } 
    return objOrArr; 
} 
// usage (using previous arr/obj) 
removeByValue(arr, 'val2'); // arr now ['val1','val3'] 
removeByValue(obj, 'val2'); // obj now {a:'val1', c: 'val3'} 

Example