【问题标题】:Javascript removing an object element from an array in a clean way (not leaving a null ghost)Javascript以干净的方式从数组中删除对象元素(不留下空鬼)
【发布时间】:2020-02-09 12:26:23
【问题描述】:

我有一个数组:

var Array = {};
Array['elements'] = [];
Array['elements'][0]['name'] = "Sally";
Array['elements'][0]['age'] = "20";
Array['elements'][3]['name'] = "Jack";
Array['elements'][3]['age'] = "21";
Array['elements'][4]['name'] = "Megan";
Array['elements'][4]['age'] = "22";

我不知道如何从数组中删除 Jack 以仅返回女性列表。 Splice 是可变的,并且传回整个对象似乎效率低下且麻烦。

在 PHP 中,您可以:

unset($Array['elements'][3]);

我试过了

delete Array['elements'][3];

但这只是在它的位置产生一个空值,并没有真正删除元素,在我测试元素的其他地方搞砸了。有没有一种干净的方法可以根据其键从数组中删除元素?

谢谢!

【问题讨论】:

  • 您编写的代码不起作用,因为 Array.elements[0] [3] 和 [4] 从未定义,您无法向它们添加属性 - 首先,我永远不会重载Array,我不会将该变量称为Array 的任何变体,因为它不是数组;最后测试null,如果你坚持.elements是一个数组(你可以把它变成一个对象,你不会得到一个稀疏数组)
  • 为什么只添加到索引 0、3 和 4?这些数字有什么意义?

标签: javascript jquery arrays javascript-objects


【解决方案1】:

试试这个,虽然它使用了拼接,但它会保留你的初始数组 -

let array = [];
array.push({name:'Sally', age:20});
array.push({name:'Jack', age:21});
array.push({name:'Megan', age:22});
let newArray = [...array];
newArray.splice(1, 1);

查看这篇文章https://jaketrent.com/post/remove-array-element-without-mutating/

【讨论】:

    【解决方案2】:

    首先,不要使用Array 作为变量名——它是javascript Array 对象,你不想覆盖它

    其次,由于Array = {},称它为Array这个词的任何变体都具有误导性,它是一个对象

    第三,您已将 Array.elements 创建为一个数组,但随后仅填充索引 0、3 和 4 - 因此您创建了一个稀疏数组以开始

    第四,您编写的代码甚至无法运行,因为您尝试将 .name 分配给 elements[0] 但此时 elements[0] 未定义,因此您最终会遇到错误,并且代码在那里停止运行

    你想要的是Array.elements = {} - 然后你可以添加/删除任何你想要的键

    例如

    var obj = {};
    obj.elements = {};
    obj.elements[0] = {};
    obj.elements[0].name = "Sally";
    obj.elements[0].age = "20";
    obj.elements[3] = {};
    obj.elements[3].name = "Jack";
    obj.elements[3].age = "21";
    obj.elements[4] = {};
    obj.elements[4].name = "Megan";
    obj.elements[4].age = "22";
    
    delete obj.elements[3];
    
    for (let i in obj.elements) {
        console.log('Number', i, 'is', obj.elements[i].name);
    }

    当将元素用作数组时,您会在初始填充数组后看到,您已经有两个 undefined 开始 - 请参阅第一个控制台输出

    注意:但是,for...in 循环将跳过那些 undefined 元素

    另请注意,未定义的元素实际上是“空槽” - 即,如果您只是输入 obj.elements[3] = undefined,则与 delete obj.elements[3] 不同

    var obj = {};
    obj.elements = [];
    obj.elements[0] = {};
    obj.elements[0].name = "Sally";
    obj.elements[0].age = "20";
    obj.elements[3] = {};
    obj.elements[3].name = "Jack";
    obj.elements[3].age = "21";
    obj.elements[4] = {};
    obj.elements[4].name = "Megan";
    obj.elements[4].age = "22";
    
    console.log(obj.elements)
    
    delete obj.elements[3];
    
    console.log(obj.elements)
    for (let i in obj.elements) {
        console.log('Number', i, 'is', obj.elements[i].name);
    }

    【讨论】:

      【解决方案3】:

      如果你想从数组中移除 Jack,你可以这样编码:

      Array['elements'].filter(e => e.name != 'Jack');

      【讨论】:

        【解决方案4】:

        您可以通过拼接它从数组中移除项:

        var a = [1,2,3,4,5]
        var removed = a.splice(1,2)
        

        a 变为:

        [1,4,5]
        

        而removed 包含:

        [2,3]
        

        您可以通过引用Nidhin's answer 选择一个新的过滤列表。


        顺便说一句,您问题中的代码不是 JavaScript...您是否在某个地方成功地运行了这些乱码?

        【讨论】:

        • 那么条目的索引将会改变
        • @Bravo 是的......这不是意图吗?
        • @svidgen Are you running that gibberish successfully somewhere? 哈哈 :D :D
        • @svidgen - 由于最初的尝试创建了一个稀疏数组,因此不确定其意图是什么 - 索引似乎很重要(应该使用对象0
        • @Bravo 是的,我认为索引是偶然的。但是,你可能是对的。 发布答案!!!
        猜你喜欢
        • 2011-06-17
        • 2017-03-21
        • 2016-05-12
        • 2020-01-31
        • 2010-09-21
        • 2018-04-11
        • 2011-03-14
        相关资源
        最近更新 更多