2012-03-28 34 views
4

採取的,例如,下列對象:如何通過值刪除JavaScript對象項目?

var fruits = { 
    "red" : "apple", 
    "blue" : "blueberry", 
    "yellow" : "banana" 
} 

我知道我可以使用delete fruits["red"]通過鍵名刪除它,但我怎麼能由水果名稱刪除對象的項目?

+0

HTTP:/ /stackoverflow.com/questions/9907419/javascript-object-get-key-by-value/9907509#9907509 – jAndy 2012-03-28 15:05:37

+0

我相信MDM的解決方案是實現這一功能的唯一方法,我很好奇,看看有沒有人聰明... – jbabey 2012-03-28 15:06:18

回答

7

你有沒有試過類似的東西?

function deleteByValue(val) { 
    for(var f in fruits) { 
     if(fruits[f] == val) { 
      delete fruits[f]; 
     } 
    } 
} 

而按照火箭的評論,你可能要檢查hasOwnProperty,以確保你是不是刪除對象的原型成員:

function deleteByValue(val) { 
    for(var f in fruits) { 
     if(fruits.hasOwnProperty(f) && fruits[f] == val) { 
      delete fruits[f]; 
     } 
    } 
} 
+0

是不是JS在迭代器的中間刪除一個項目挑剔? (我可能會玩得更安全,但不知道你是否有絕對的答案)。 – 2012-03-28 15:07:22

+2

不應該在'for ... in'中檢查'hasOwnProperty'嗎? – 2012-03-28 15:07:27

+0

@BradChristie它對我來說從來沒有挑剔過,Chrome控制檯的一個快速測試證實,儘管它可能因瀏覽器而異,但它足夠快樂。 – mdm 2012-03-28 15:09:15

1
var key = null; 
for (var k in fruits){ 
    if (fruits[k] === 'apple'){ 
    key = k; 
    break; 
    } 
} 
if (key != null) 
    delete fruits[key]; 

遍歷對象找到相應的鍵,然後將其刪除(如果找到)。

+0

不應該在'for ... in'中檢查'hasOwnProperty'嗎? – 2012-03-28 15:08:29

0

可以使用拼接方法

fruits.splice($.inArray("red", fruits), 1); 

但這當然使用jQuery的。

您還可以使用這個擴展:

Array.prototype.remove = function() { 
    var what, a = arguments, L = a.length, ax; 
    while (L && this.length) { 
     what = a[--L]; 
     while ((ax = this.indexOf(what)) != -1) { 
      this.splice(ax, 1); 
     } 
    } 
    return this; 
} 
+0

這是一個對象,而不是一個數組。 – Tracker1 2012-03-28 15:48:20

0

這件怎麼樣?

function delteByValue(a){ 
    fruits.foreach(function(k, v) { 
    if (fruits[v] == a){ 
     delete fruits[k]; 
    } 
    }); 
} 
0

我認爲這是一個好主意,以創建功能和覆蓋Object.prototype中:

/** 
* @autor Javier Cobos 
* @param value The value to look for 
* @return true if founded deleted, false if not 
*/   
Object.prototype.removeByValue = function(value){ 
     var i; 
     for(i in this){ 
      if(this.hasOwnProperty(i)) 
       if(value === this[i]){ 
        delete(this[i]); 
        return true; 
       } 
     } 
     return false; 
     } 

// Example 
    var fruits = { 
     "red" : "apple", 
     "blue" : "blueberry", 
     "yellow" : "banana" 
    } 

     fruits .removeByValue("apple"); 

這種方式,我們必須在我們的腳本:)

+0

擴展Object.prototype和Array.prototype在IE中創建了很多表面問題<= 8 ...最好將這樣的方法添加到Underscore或jQuery等實用工具中。 $ .removeByValue =函數(對象,值){...}(注意:這些問題往往表現爲處理第三方腳本,如谷歌分析或廣告) – Tracker1 2012-03-28 15:50:02

+0

也許你可以將這個功能封裝到你正在使用的函數中它可以避免衝突 – 2012-03-29 06:28:45

0
每一個對象的新方法

我知道你有幾個可以接受的答案在這一點上...我將包括一個通用函數...

// NOTE, replace "Object.removePropertyByValue" 
// with say "jQuery.removePropertyByValue" or "_.removePropertyByValue" 
// to create a jQuery or Underscore extension. 
Object.removePropertyByValue = function(obj, val) { 
    //store list of properties to remove 
    var propsToRemove = []; 

    for (var prop in obj) { 
    if (obj.hasOwnProperty(prop) && obj[prop] === val) { 
     //save the property name here, deleting while enumerating is a bad idea. 
     propsToRemove.push(prop); 
    } 
    } 

    //remove all the items stored. 
    while (propsToRemove.length) delete obj[propsToRemove.pop()]; 
}

從這裏你應該能夠調用:Object.removePropertyByValue(fruits, "red");

+0

將方法綁定到Object構造函數是安全的,但對於擴展Object.prototype(或Array.prototype)並不安全,因爲在第三方腳本中會有很多意想不到的後果。 (看着你的Google) – Tracker1 2012-03-28 15:59:51

-2
var fruits = { 
    "red" : "apple", 
    "blue" : "blueberry", 
    "yellow" : "banana" 
} 
delete fruits.red; // or use => delete fruits['red']; 
console.log(fruits); 

這將刪除fruits.red

+0

他想用對象值刪除。不是一個關鍵。 – Hakan 2017-04-03 15:01:08

0

使用此功能

function delobj(x,n,v){ 
    n = "elem."+n; 
    var u = x.filter(function(elem, index, self){ 
     if(eval(n) != v){ 
      return index == self.indexOf(elem); 
     } 
    }) 
    return u; 
} 

使用這樣

delobj(object "object name",string "name of element",string "value of element") 
相關問題