使用javascript删除数组元素

时间:2014-06-24 12:40:15

标签: javascript jquery arrays

我是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);
}

未获得正确的索引。请告诉我代码中的错误。

感谢。

5 个答案:

答案 0 :(得分:2)

由于要移除的项目与actionDic中的每个元素之间的比较并非微不足道,因此您可以使用jQuery.grep()

actionDic = jQuery.grep(actionDic, function(elem) {
    return elem.tag == deleterow.tag && elem.description == deleterow.description;
}, true);

Demo

它使用自定义搜索功能执行搜索,并返回不匹配的数组元素。结果替换了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);
}

Demo

答案 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"]);
    }
}

工作小提琴:http://jsfiddle.net/4khjp/

答案 4 :(得分:-1)

您可以使用包含许多有用的对象,数组等助手的underscore.js

删除数组元素:

array = _.reject(array, function(item) {
 return item.tag == 'tag2'; // <- if tag is unique to whole array
});