2012-03-28 48 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") 
相关问题