Js 删除某个数组中指定的对象

var tradeSelections = [
        {prop:'a', label:"111", width: "" },
        {prop: "c", label: "222", width: "146" },
        {prop:'c', label:"3333",width: "" },
        {prop:'d', label:"444", width: "" },
        {prop:'e', label:"555", width: "" },
        {prop:'f', label:"666", width: "" },
        {prop:'g', label:"777", width: "" },
    ]
//删除数组中指定的对象,得到数据格式
tradeSelections = [
    {prop:'a', label:"111", width: "" },
    {prop: "c", label: "222", width: "146" },
    {prop:'c', label:"3333",width: "" },
    {prop:'d', label:"444", width: "" },
    {prop:'e', label:"555", width: "" },
    {prop:'f', label:"666", width: "" },
]
阅读 8k
6 个回答
tradeSelections = tradeSelections.filter(item => item.prop !== 'g');

我只想到这一种方案

this.tradeSelections.splice(this.tradeSelections.indexOf(this.tradeSelections.find(function(item){ return item.prop == "g"; })), 1);
function remove(source, target) {
    var keys = [];
    for (keys[keys.length] in target);
    if (keys.length) {
        loop: for (var i = 0; i < source.length; ++i) {
            for (var j = 0; j < keys.length; ++j) {
                if (target[keys[j]] !== source[i][keys[j]]) {
                    continue loop;
                }
            }
            source.splice(i, 1);
            break;
        }
    }
    return source;
}
console.dir(remove(tradeSelections, { prop: "g", label: "777", width: "" }));

删除,是门学问

从题主的问题来看,解决这个问题最简单的办法是删除掉最后一个元素

tradeSelections.splice(-1, 1);

如果要删除多个元素的情况会麻烦一点,稍后再说。这里要注意到一个点 —— 这个操作是直接修改原数组

如果不希望改原数组,上面的 splice 操作应该用 slice 操作来代替,而且 slice 是把需要的数据取出来,而不是去掉不要的。

const newList = tradeSelections.slice(0, -1);
注:关于负数序号的问题,建议自己去 MDN 查 splice 和 slice 的文档

以上,算是开个胃。

然后说正题 —— 如果要按一定条件删除数组中的元素,会比较麻烦一点,因为删除元素会造成后序元素移位。但是多数情况下我们会采用删除的反操作 —— 留取 —— 来解决这个问题,也就是大家熟悉的 .fitler()。只不过,这会产生一个新数组,对于需要处理原数组的情况不适用!!!

filter 的例子不说了。这里说一种常见的删除手法 —— 逆序遍历。比如在题主的 case 里要删除 prop 为 "c"

for (let i = tradeSelections.length - 1; i >= 0; i--) {
    if (tradeSelections[i].prop === "c") {
        tradeSelections.splice(i, 1);
    }
}

因为删除元素会引起后序元素移位,从后往前删不就好了吗?!

如果需要经常使用删除功能,甚至可以简单地封一个方法(简单,是因为没做容错处理)

Array.prototype.removeAll = function (predicate) {
    for (let i = this.length - 1; i >= 0; i--) {
        if (predicate(this[i], i, this)) {
            this.splice(i, 1);
        }
    }
    return this;
};

tradeSelections.removeAll(it => it.prop === "c");
新手上路,请多包涵
tradeSelections.splice(tradeSelections.findIndex(el=>el.prop=='g'),index,1)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题