从中删除元素后,javascript 数组的长度不会改变
Length of the javascript array does not change after deleting the element from it
我正在尝试将一个数组值复制到另一个数组中,但不断开与此数组关联的链接,换句话说,我不能只将新数组分配给此值,这就是为什么我无法使用切片((或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];
}
}
}
我的问题是当我从数组中删除某些内容时,数组的长度不会改变。
附言如果你知道任何更简单的方法,我完全愿意接受提议。
数组的长度永远不会通过删除其中的元素来更改。
但是,它可以通过splice
进行更改例如。
var arr=[1,2,3,4,5]; //length 5
arr.splice(0,1); //length 4
与通常认为的不同,delete
运算符与直接释放内存无关。 delete
仅对对象的属性有效。它对数组长度没有影响
splice(( 方法通过删除 现有元素和/或添加新元素。
更多关于拼接
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
(除了它的原型方法(只不过是一个简单的对象。区别在于具有特殊二传手方法的长度属性,以及添加新属性的不同方式。如果将属性添加到对象,则会测试其名称是否为数值,以及此值是否>= 当前数组长度。如果是这样,则更新内部长度。如果设置了长度,则检查新值是否小于旧值,如果是,则将删除所有属性名称为数值且>= 新长度的属性。
如果从数组中删除索引元素,它只会被删除(稍后访问此索引将返回 undefined,就像处理任何不存在的属性一样(。它不会更改数组长度,也不会增加数组长度为添加的索引位置(稀疏数组(创建任何属性。使用 []
或 new Aray[10000]
将创建具有完全相同内存占用的数组。只有 length 属性具有不同的初始值。
这与其他语言中的数组完全不同,在其他语言中,大小n
的数组将为元素保留 n 个存储空间(作为指向对象的指针或本机值类型(。因此,在其他语言中,创建给定大小的数组并填充它比创建一个空数组并添加值更快(在这种情况下,每次必须分配更大的连续空间,并且必须在添加元素之前将数组复制到这个更大的内存位置(。OTOH,访问JS数组的元素比在其他语言中慢一些,其中元素位于给定的固定位置。
如果使用数组,此答案将无济于事,但是。
如果仍然需要按键删除项目,则可以使用 object:
$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
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]
但是如果您的数组包含其他数组,则此方法不适用
- d3.根据数组内容改变各个节点的颜色
- 从中删除元素后,javascript 数组的长度不会改变
- Javascript排序的数组会改变窗口对象,但在遍历它时不会改变
- 保持数组的顺序,但改变索引的位置
- JavaScript数组随着DOM的改变而改变
- 在函数内改变JavaScript数组
- Ng-repeat与指令:如何销毁重复项目后,数组已经改变
- 为什么数组'的长度属性'的值改变,即使在javascript中设置为只读
- 我如何使一个按钮改变Javascript数组位置
- Knockout:在改变可观察数组后设置select的标题
- 在不改变整个状态的情况下改变state数组(REACT / REDUX)
- 为什么knockoutjs js不't更新视图,如果一些子数组被改变
- Javascript array. prototype.sort()无意中改变了数组
- 根据数组中对象的数量改变id (javascript/jquery)
- Javascript数组一起改变
- react.js在改变状态数组后不更新DOM
- 如何改变传递给函数的数组,而不需要在javascript中迭代它的项
- 为什么改变一个已经推送到数组中的对象也会改变数组中的值呢?
- 如何在加载后将媒体变量添加到数组时不改变它们.闭包
- 如何改变JavaScript's JSON中使用的数组括号