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
How to delete a javascript object item by value?
提问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 hasOwnProperty
to 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