javascript 如何按值删除javascript对象项?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9910336/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 08:11:23  来源:igfitidea点击:

How to delete a javascript object item by value?

javascriptobject

提问by amlane86

Take, for instance, the following object:

以以下对象为例:

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

I know I can use delete fruits["red"]to remove it by the key name, but how could I delete the object item by the fruit name?

我知道我可以delete fruits["red"]通过键名删除它,但是我怎么能通过水果名删除对象项呢?

回答by mdm

Have you tried something like this?

你有没有尝试过这样的事情?

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

And as per Rocket's comment, you might want to check hasOwnPropertyto make sure you aren't deleting members of the object's prototype:

根据 Rocket 的评论,您可能需要检查hasOwnProperty以确保您没有删除对象原型的成员:

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

回答by Brad Christie

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

Iterate over the object finding the corresponding key, then remove it (if found).

遍历对象找到相应的键,然后将其删除(如果找到)。

回答by it Haffens

Don't know if this is efficient in terms of processing but using filter you can get this done in three lines:

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

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

var appleless_keys = Object.keys(fruits).filter(this_fruit => fruits[this_fruit] !== "apple");
appleless_obj = {};
appleless_keys.forEach(key => appleless_obj[key] = fruits[key]);
console.dir(appleless_obj);

Or as a function:

或者作为一个函数:

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

function remove_fruit(fruit_to_remove,fruits){
  var new_keys = Object.keys(fruits).filter(this_fruit => fruits[this_fruit] !== fruit_to_remove);
  new_obj = {};
  new_keys.forEach(key => new_obj[key] = fruits[key]);  
  return new_obj;
}

console.dir(remove_fruit("apple",fruits));

回答by milad

use this function

使用这个功能

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;
}

use like this

像这样使用

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

回答by p0rter

what about this one?

这个如何?

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

回答by Javier Cobos

I think its a good idea to create a function and override the Object.prototype:

我认为创建一个函数并覆盖 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");

This way we have a new method for every single Object in our script :)

这样我们就为脚本中的每个对象都有了一个新方法:)

回答by Tracker1

I know you have several acceptable answers at this point... I'm going to include a generic function for this...

我知道此时您有几个可以接受的答案......我将为此包含一个通用函数......

// 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()];
}

From here you should be able to call: Object.removePropertyByValue(fruits, "red");

从这里你应该可以调用: Object.removePropertyByValue(fruits, "red");

回答by CyclingFreak

You can use the splice method

您可以使用拼接方法

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

But this uses jQuery of course.

但这当然使用 jQuery。

You can also use this extension:

你也可以使用这个扩展:

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;
}

回答by Xman Classical

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

this deletes fruits.red

这将删除fruits.red