采取的,例如,下列对象:如何通过值删除JavaScript对象项目?
var fruits = {
"red" : "apple",
"blue" : "blueberry",
"yellow" : "banana"
}
我知道我可以使用delete fruits["red"]
通过键名删除它,但我怎么能由水果名称删除对象的项目?
采取的,例如,下列对象:如何通过值删除JavaScript对象项目?
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];
}
}
}
而按照火箭的评论,你可能要检查hasOwnProperty
,以确保你是不是删除对象的原型成员:
function deleteByValue(val) {
for(var f in fruits) {
if(fruits.hasOwnProperty(f) && fruits[f] == val) {
delete fruits[f];
}
}
}
是不是JS在迭代器的中间删除一个项目挑剔? (我可能会玩得更安全,但不知道你是否有绝对的答案)。 – 2012-03-28 15:07:22
不应该在'for ... in'中检查'hasOwnProperty'吗? – 2012-03-28 15:07:27
@BradChristie它对我来说从来没有挑剔过,Chrome控制台的一个快速测试证实,尽管它可能因浏览器而异,但它足够快乐。 – mdm 2012-03-28 15:09:15
var key = null;
for (var k in fruits){
if (fruits[k] === 'apple'){
key = k;
break;
}
}
if (key != null)
delete fruits[key];
遍历对象找到相应的键,然后将其删除(如果找到)。
不应该在'for ... in'中检查'hasOwnProperty'吗? – 2012-03-28 15:08:29
可以使用拼接方法
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;
}
这是一个对象,而不是一个数组。 – Tracker1 2012-03-28 15:48:20
这件怎么样?
function delteByValue(a){
fruits.foreach(function(k, v) {
if (fruits[v] == a){
delete fruits[k];
}
});
}
我认为这是一个好主意,以创建功能和覆盖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");
这种方式,我们必须在我们的脚本:)
扩展Object.prototype和Array.prototype在IE中创建了很多表面问题<= 8 ...最好将这样的方法添加到Underscore或jQuery等实用工具中。 $ .removeByValue =函数(对象,值){...}(注意:这些问题往往表现为处理第三方脚本,如谷歌分析或广告) – Tracker1 2012-03-28 15:50:02
也许你可以将这个功能封装到你正在使用的函数中它可以避免冲突 – 2012-03-29 06:28:45
我知道你有几个可以接受的答案在这一点上...我将包括一个通用函数...
// 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");
将方法绑定到Object构造函数是安全的,但对于扩展Object.prototype(或Array.prototype)并不安全,因为在第三方脚本中会有很多意想不到的后果。 (看着你的Google) – Tracker1 2012-03-28 15:59:51
var fruits = {
"red" : "apple",
"blue" : "blueberry",
"yellow" : "banana"
}
delete fruits.red; // or use => delete fruits['red'];
console.log(fruits);
这将删除fruits.red
他想用对象值删除。不是一个关键。 – Hakan 2017-04-03 15:01:08
使用此功能
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")
HTTP:/ /stackoverflow.com/questions/9907419/javascript-object-get-key-by-value/9907509#9907509 – jAndy 2012-03-28 15:05:37
我相信MDM的解决方案是实现这一功能的唯一方法,我很好奇,看看有没有人聪明... – jbabey 2012-03-28 15:06:18