如下圖,如果我想查找testArray中的一個物件是否在currentArray中,可以使用for回圈遍歷陣列,也可以使用find(), some(), include()。最糟糕的表現是如果我全部陷入至少一次 O(n^2)。
如果我首先過濾 currentArray 中余額不是 999 或 999.999 的專案,然后檢查 testArray。性能是否比陷入至少一次更好?或者有什么方法可以做得更好?
謝謝!
let currentArray = [
{account: 1, balance: 200},
{account: 2, balance: 100},
{account: 3, balance: 300},
{account: 4, balance: 999},
{account: 5, balance: 999.999},
{account: 6, balance: 999},
{account: 15, balance: 999.999},
{account: 8, balance: 100},
{account: 9, balance: 300},
{account: 10, balance: 300},
]
let testArray = [
{account: 4, balance: 999},
{account: 5, balance: 999.999},
{account: 6, balance: 999},
{account: 7, balance: 999.999},
{account: 8, balance: 999},
{account: 9, balance: 999.999},
{account: 10, balance: 999},
{account: 11, balance: 999.999},
{account: 12, balance: 999},
{account: 13, balance: 999.999},
{account: 14, balance: 999},
{account: 15, balance: 999.999},
]
uj5u.com熱心網友回復:
據我了解,對于給定的示例陣列,您期望得到以下結果:
[
{ "account": 4, "balance": 999 },
{ "account": 5, "balance": 999.999 },
{ "account": 6, "balance": 999 },
{ "account": 15, "balance": 999.999 }
]
...因為這些都出現在兩個陣列中。
為了以更好的時間復雜度實作這一點,請為每個物件使用唯一的鍵。知道您的物件有一個由兩個屬性組成的鍵,您可以將這兩個值組合在一個陣列中并生成其 JSON 編碼(或任何其他合適的編碼):該字串將是每個物件的唯一 ID。將第一個陣列的那些存盤在一個集合中,然后迭代第二個陣列以檢查物件是否具有出現在集合中的識別符號。
let currentArray = [
{account: 1, balance: 200},
{account: 2, balance: 100},
{account: 3, balance: 300},
{account: 4, balance: 999},
{account: 5, balance: 999.999},
{account: 6, balance: 999},
{account: 15, balance: 999.999},
{account: 8, balance: 100},
{account: 9, balance: 300},
{account: 10, balance: 300},
];
let testArray = [
{account: 4, balance: 999},
{account: 5, balance: 999.999},
{account: 6, balance: 999},
{account: 7, balance: 999.999},
{account: 8, balance: 999},
{account: 9, balance: 999.999},
{account: 10, balance: 999},
{account: 11, balance: 999.999},
{account: 12, balance: 999},
{account: 13, balance: 999.999},
{account: 14, balance: 999},
{account: 15, balance: 999.999},
];
const hash = ({account, balance}) => JSON.stringify([account, balance]);
let ref = new Set(currentArray.map(hash));
let result = testArray.filter(obj => ref.has(hash(obj)));
console.log(result);
如果你只關心是否有這樣的物件,那么使用some代替filter。回傳值將是一個布林值:當有這樣的物件時為真,否則為假。
如果您有興趣找到一個這樣的物件,請使用find代替filter。回傳值將是第一個找到的物件,或者undefined當沒有這樣的物件時。
提高時間復雜度的關鍵是使用Set. 它也可以是一個帶有 JSON 字串作為屬性名稱的普通物件,并且每個物件都有一個任意值(如true)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355680.html
標籤:javascript 数组 算法 for循环
上一篇:解決回圈依賴的演算法?
