如何按值删除javascript对象项?

如何按值删除javascript对象项?,javascript,object,Javascript,Object,以以下对象为例: var fruits = { "red" : "apple", "blue" : "blueberry", "yellow" : "banana" } 我知道我可以使用delete fruits[“red”]按键名删除它,但如何按水果名删除对象项?您尝试过类似的方法吗 function deleteByValue(val) { for(var f in fruits) { if(fruits[f] == val) {

以以下对象为例:

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

我知道我可以使用
delete fruits[“red”]
按键名删除它,但如何按水果名删除对象项?

您尝试过类似的方法吗

function deleteByValue(val) {
    for(var f in fruits) {
        if(fruits[f] == val) {
            delete fruits[f];
        }
    }
}
根据Rocket的评论,您可能需要检查
hasOwnProperty
,以确保您没有删除对象原型的成员:

function deleteByValue(val) {
    for(var f in fruits) {
        if(fruits.hasOwnProperty(f) && fruits[f] == val) {
            delete fruits[f];
        }
    }
}
/**
 *  @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");

在对象上迭代查找相应的键,然后删除它(如果找到)。

您可以使用拼接方法

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;
}
这个怎么样

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

我认为创建函数并覆盖对象是个好主意。原型:

function deleteByValue(val) {
    for(var f in fruits) {
        if(fruits.hasOwnProperty(f) && fruits[f] == val) {
            delete fruits[f];
        }
    }
}
/**
 *  @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");

通过这种方式,我们为脚本中的每个对象都提供了一种新方法:)

我知道在这一点上您有几个可以接受的答案。。。我将为这个函数包含一个泛型函数

// 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.removePropertyValue(红色)

使用此功能

function delobj(obj,val){
    for (x in obj) {
        if(obj[x] == val)
        delete obj[x]
    }
    return obj;
}
像这样使用

delobj(object "object name",string "value of element")

不知道这在处理方面是否有效,但使用过滤器可以通过三行完成:

var={
“红色”:“苹果”,
“蓝色”:“蓝莓”,
“黄色”:“香蕉”
}
var applless_keys=Object.keys(fruits).filter(this_fruit=>fruits[this_fruit]!==“apple”);
applless_obj={};
forEach(key=>applless_obj[key]=freults[key]);

console.dir(applless_obj)使用键删除简化

function stripProperty(o, v) {
    return  (delete o[Object.keys(o).splice(Object.values(o).indexOf(v), 1)])?o:0;
}   
var={
“红色”:“苹果”,
“蓝色”:“蓝莓”,
“黄色”:“香蕉”
}
函数stripProperty(o,v){
返回(删除o[Object.key(o).splice(Object.values(o.indexOf(v),1)])?o:0;
}   

log(stripProperty(水果,'香蕉')我相信MDM的解决方案是实现这一功能的唯一途径,我很好奇,看看有没有人有什么灵巧的……JS不是在迭代过程中删除一个项目的挑剔吗?(我可能只是为了更加安全起见,但不知道你是否有绝对答案)。你不应该检查
中的
hasOwnProperty
以查找
中的…吗?如果你找到一个键,你应该跳过循环的其余部分,因为它不会再次出现。你是按值删除的,而不是按键删除的,一个值很容易出现两次。一把钥匙保证只出现一次。哦,那是真的。我的错。很抱歉你不应该检查
中的
的hasOwnProperty
吗?它是一个对象,而不是数组。扩展object.prototype和array.prototype会在IE中产生很多表面问题也许你可以将此功能封装到你正在使用的函数中以避免冲突将方法绑定到对象构造函数是安全的,但是扩展Object.prototype(或Array.prototype)并不安全,因为在第三方脚本中有很多意外的结果。(看着你谷歌)未捕获类型错误:x.filter不是一个函数?