从javascript数组中删除元素后,该数组的长度不会更改

cgyqldqp  于 2023-03-16  发布在  Java
关注(0)|答案(5)|浏览(385)

我试图将一个数组的值复制到另一个数组中,但是没有断开与这个数组关联的链接,换句话说,我不能将新数组赋给这个值,这就是为什么我不能使用slice()或concat()这样的方法。

self.updateBreadcrumbs = function (newBreadcrumbs) {
            var old_length = self.breadcrumbs.length;
            var new_length =newBreadcrumbs.length;
            var j = new_length > old_length ? new_length: old_length;

            for (var i = 0; i < j; i++) {
                if(old_length < i+1){
                    self.breadcrumbs.push(newBreadcrumbs[i]);
                    continue;
                }
                if(new_length < i+1){
                    delete self.breadcrumbs[i];
                    continue;
                }
                if (self.breadcrumbs[i].title !== newBreadcrumbs[i].title) {
                    self.breadcrumbs[i] = newBreadcrumbs[i];
                }

            }
        }

我的问题是当我从数组中删除一些内容时,数组的长度不会改变。
如果你知道任何更简单的方法来做到这一点,我完全开放的命题。

wljmcqd8

wljmcqd81#

删除Array中的元素永远不会更改Array的长度。
然而,它可以改变与splice例如.

var arr=[1,2,3,4,5]; //length 5
arr.splice(0,1); //length 4

与通常的看法不同,delete操作符与直接释放内存无关。delete只对对象的属性有效,对数组长度没有影响

**splice()**方法通过删除现有元素和/或添加新元素来更改数组的内容。

有关**Splice的详细信息**

zqdjd7g9

zqdjd7g92#

Array对象的length属性是由其方法维护的属性,它不是对象本身的固有特性。因此,如果您对其执行的操作不是Array自己的方法之一,它将不会更新length属性。在这种情况下,您要使用的是splice方法(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
有趣的是,你可以通过直接改变数组的长度来改变它的组成......例如,如果你有一个包含6个元素的数组,你要把它的length属性改为5(即array.length = 5;),它将不再把第6个元素识别为数组的一部分。
更多关于length属性的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length

jhiyze9q

jhiyze9q3#

数组是(除了它的原型方法)不比一个简单的对象多多少。不同之处在于length属性有一个特殊的setter方法,以及添加新属性的不同方式。如果一个属性被添加到对象中,它的名称会被测试是否是一个数值,以及这个值是否〉=当前数组长度。如果是,内部长度会被更新。如果长度被设置,检查新值是否小于旧值,如果是,则删除属性名为数值且〉=新长度的所有自有属性。
如果从数组中删除索引元素,则该元素将被删除(以后访问这个索引将返回undefined,就像它对任何不存在的属性所做的那样)。它不会改变数组长度,增加数组长度也不会为添加的索引位置创建任何属性(稀疏数组)。使用[]new Aray[10000]将创建内存占用完全相同的数组。只是length属性的初始值不同。
这与其他语言中的数组完全不同,在其他语言中,大小为n的数组将为元素保留n个存储空间(是指向对象的指针或者是本机值类型)。所以在其他语言中,创建具有给定大小的数组并填充它比创建空数组并添加值要快(在这种情况下每次都必须分配更大的连续空间并且在添加元素之前必须将数组复制到该更大的存储器位置)。访问JS数组的元素比在其他语言中访问元素位于其给定的固定位置的语言稍微慢一些(因为它们只是必须首先位于属性列表中的命名属性)。

tyg4sfes

tyg4sfes4#

如果您使用数组,则此答案没有帮助,但是。
如果仍需要按键删除项目,则可以使用对象:

$o = {'blue' : '', 'apple' : '', 'red' : ''};

console.log(Object.keys($o).length); // will output 3 
delete $o['apple'];
console.log(Object.keys($o).length); // will output 2
00jrzges

00jrzges5#

let arr = ['qwe', 1, null]
delete arr[1]      // true
arr.length         // 3 if you do not like such result, use
arr.flat().length  // 2, ok?
arr                // ['qwe', empty, null]

但如果您的数组包含其他数组,则此方法不适用

相关问题