這可能看起來像一個重復的問題,但請不要僅僅因為它看起來與其他問題相似就假設這一點,并且要小心簡單的答案,除非你真的理解后果。
這是一個控制臺對話框來演示該問題:
> a = [0,1,2]
< >(3) [0,1,2]
> a.length
< 3
> a[99] = 99
< 99
> a.length
< 100
> delete a[99]
< true
> a.length
< 99
所以陣列的這個長度屬性似乎沒有遵循任何合理的規范。尾隨稀疏元素應該被壓縮,但不是。
我認為因此,長度屬性不應該在代碼中使用,因為它在語意上沒有意義。(而findLastIndex(() => true)應該在天真的程式員以前使用的任何地方使用length。)
我知道如何使用優雅的 forEach、some、every、find、filter、map 和 reduce 函式。而且我知道過濾器不會保留稀疏性。我可以使用 reduce 來做一個可以洗掉元素的映射或一個保留稀疏性的過濾器。
我們如何在不復制陣列的情況下將陣列長度屬性重置為合理的值?
可能根本沒有答案,或者更確切地說,答案可能是“沒有辦法,陣列長度屬性本質上沒有意義”。
PS:對于那些對這個關鍵問題表現出敵意并投票并關閉的人,你沒有提供答案,你也沒有聲稱這個問題的真相。你根本沒有理由去關閉。這個問題盡可能清晰、詳細和集中。對這個問題的敵意只是反映了我把手指伸進臟傷口的事實。如果您認為自己很聰明,那么請提供 Array length 屬性語意的完整且真實的定義,并且不要為了滿足您關閉它的愿望而對我的問題撒謊。
uj5u.com熱心網友回復:
由于 JavaScript 規范中沒有規定length必須比最后一個索引正好高一個,因此您的要求是不合理的。在常用的情況下,密集陣列的數量壓倒性地超過稀疏陣列。由于 JavaScript 不會將索引保持在有序結構中,因此每次陣列內容更改時找出哪個索引是最后一個索引會在許多不需要這種更強不變數的情況下導致性能損失。
如果您確實需要修剪陣列以排除尾隨的非元素,那么很容易做到:找到最后一個有效索引,然后自己縮小陣列:
const a = [0,1,2]
a[99] = 99
delete a[99]
a.length = a.findLastIndex(i => i in a) 1;
console.log(a); // [1, 2, 3]
console.log(a.length); // 3
能不能慢一點,萬一哪里length大?是的。這正是默認情況下不進行此計算的原因。
編輯:findLastIndex并非在所有瀏覽器中都存在,可能需要解決方法或 polyfill。
EDIT2:更好的是,reduce可以使用它,它不會為不存在的索引呼叫謂詞(并且也存在于所有當前瀏覽器中):
const a = [0,1,2]
a[99] = 99
delete a[99]
a.length = a.reduce((l, x, i) => i, 0) 1;
console.log(a); // [1, 2, 3]
console.log(a.length); // 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469097.html
標籤:javascript 数组 稀疏矩阵
