採取的,例如,下列對象:如何通過值刪除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