我是javascript&的新手jquery,需要从下面的数组结构中删除一个元素
[{
"tag": "tag1",
"description": "description1"
}, {
"tag": "tag2",
"description": "description2"
}, {
"tag": "tag3",
"description": "description3"
}]
要删除的元素是{"tag":"tag2", "description":"description2"}
。
如何找到此元素并从数组中删除。
请找到我用来删除元素的代码
var actionDic = [];
actionDic.push({
description: desc,
tag: tag
});
当用户在textinput中输入文本并选择“添加”选项时,将填充actionDic数组。
var deleterow = {
tag: "tag2",
description: "description2"
};
var index = $.inArray(deleterow, actionDic);
if (index != -1) {
actionDic.splice(index, 1);
}
未获得正确的索引。请告诉我代码中的错误。
感谢。
答案 0 :(得分:2)
由于要移除的项目与actionDic
中的每个元素之间的比较并非微不足道,因此您可以使用jQuery.grep()
:
actionDic = jQuery.grep(actionDic, function(elem) {
return elem.tag == deleterow.tag && elem.description == deleterow.description;
}, true);
它使用自定义搜索功能执行搜索,并返回不匹配的数组元素。结果替换了actionDic
的先前值,并有效地删除了该项。
不幸的是,这个方法可能被认为很重,因为每次调用都会创建一个新数组;无论是jQuery可以做什么还是标准JavaScript功能,这个特殊功能都缺乏。 ECMAScript 6将使用Array.prototype.find()
方法来完成在数组中查找索引的工作(使用它可以执行拼接)。
你当然可以自己写一个:
(function($) {
$.find = function(arr, fn) {
for (var i = 0, len = arr.length; i < len; ++i) {
if (fn(arr[i], i, arr)) {
return i;
}
}
return -1;
};
}(jQuery));
var index = $.find(actionDic, function(elem) {
return elem.tag == deleterow.tag && elem.description == deleterow.description;
});
if (index != -1) {
actionDic.splice(index, 1);
}
答案 1 :(得分:2)
我在其中一个项目中实施了indexOfObject
Array prototype
方法。它按给定的object
名称和值搜索property
的索引。这是:
Array.prototype.indexOfObject = function(searchTerm, property) {
for (var i = 0, l = this.length; i < l; i++) {
if (this[i][property] === searchTerm) {
return i;
}
}
return -1;
};
您可以使用此方法使用唯一属性查找对象的索引。在您的情况下,您可以像这样使用它:
var arr = [{
"tag": "tag1",
"description": "description1"
}, {
"tag": "tag2",
"description": "description2"
}, {
"tag": "tag3",
"description": "description3"
}], deleteObject = {
tag: "tag2",
description: "description2"
};
var index = arr.indexOfObject(deleteObject.tag, 'tag');
然后您可以使用该索引从数组中删除对象:
if (index > -1) {
arr.splice(index, 1);
}
以下是JSFiddle中的工作示例。
答案 2 :(得分:-1)
var actionDic = [{
"tag": "tag1",
"description": "description1"
}, {
"tag": "tag2",
"description": "description2"
}, {
"tag": "tag3",
"description": "description3"
}]
var element = {"tag":"tag2", "description":"description2"}
for(var i=0;i<actionDic.length;i++) {
var found = false;
for(each in actionDic[i]) {
if(actionDic[i][each] == element[each]) {
found = true
} else {
found = false;
break;
}
}
if(found) {
actionDic.splice(i,1);
found=false;
}
}
答案 3 :(得分:-1)
这将获取内部数组对象:
for (var x = 0; x < actionDic.length; x++){
var arrayItem = actionDic[x];
if (arrayItem["tag"] == "tag2"){
alert(arrayItem["description"]);
}
}
答案 4 :(得分:-1)
您可以使用包含许多有用的对象,数组等助手的underscore.js。
删除数组元素:
array = _.reject(array, function(item) {
return item.tag == 'tag2'; // <- if tag is unique to whole array
});