亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據另一個數組過濾和排序對象數組

如何根據另一個數組過濾和排序對象數組

HUH函數 2023-03-24 13:45:07
我有一組用戶需要根據另一個數組“過濾器”進行過濾和排序。閱讀下面的代碼,您可以看到預期的結果。const users = [   { key: 'abc', name: 'Anna', age: 22, gender: 'F' },   { key: 'def', name: 'John', age: 25, gender: 'M' },  { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },  { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } ] const filter = [   { key: 'jkl' },  { key: 'def' },  { key: 'abc' },] // Here is the expected result:const expected_result = [   { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' },  { key: 'def', name: 'John', age: 25, gender: 'M' },  { key: 'abc', name: 'Anna', age: 22, gender: 'F' }] 請考慮“key”屬性是唯一的。有誰知道我該怎么做?如果您還可以解釋代碼背后的邏輯,我將不勝感激。我是初學者,正在為如何使用 JavaScript 函數來執行此操作而苦苦掙扎。提前致謝!
查看完整描述

4 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

您可以將您的第一個用戶數組轉換為Map. Map 類似于對象,但是,它有一些差異(我在這里使用 Map,因為與對象相比,它更容易從數組構造)。

地圖將具有以下形狀:

Map {

  "abc": { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 

  "def": { key: 'def', name: 'John', age: 25, gender: 'M' },

  "ghi": { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },

  "jkl": { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 

}

在下面的代碼中,上面的 Map 存儲在一個名為lut(look-up-table 的縮寫)的變量中。這樣做lut.get("def")將返回存儲在 key 中的對象"def",在這種情況下該對象是:


{ key: 'def', name: 'John', age: 25, gender: 'M' }

JavaScript 引擎優化了這種查找,使其非常高效,因此創建這樣的 Map 有助于提高整體可伸縮性,這意味著如果您有很多用戶,它會很高效。


由于輸出中的順序很重要,因此您可以使用.map()數組filter(決定順序)將具有 name 屬性的每個對象轉換為我們構建的 Map 中的對象。要執行“轉換”,您可以返回所需的新對象,您可以使用.get(o.key).


請參閱下面的工作示例:


const users = [{ key: 'abc', name: 'Anna', age: 22, gender: 'F' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'ghi', name: 'Mary', age: 27, gender: 'F' }, { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' }]; 

const filter = [{ key: 'jkl' }, { key: 'def' }, { key: 'abc' }]; 

const expected_result = [{ key: 'jkl', name: 'Joe',  age: 30, gender: 'M' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'abc', name: 'Anna', age: 22, gender: 'F' }];


const lut = new Map(users.map(o => [o.key, o]));

const result = filter.map(f => lut.get(f.key));

console.log(result);

如果過濾器中的某個對象可以具有不在用戶列表中的用戶的鍵,則上述方法會將過濾器對象轉換為“未定義”。如果你想忽略它,你可以.filter()在映射之前使用。使用.filter()將刪除地圖中沒有鍵的所有過濾器對象:

const users = [{ key: 'abc', name: 'Anna', age: 22, gender: 'F' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'ghi', name: 'Mary', age: 27, gender: 'F' }, { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' }]; 

const filter = [{ key: 'nonUserKey' }, { key: 'def' }, { key: 'abc' }]; 

const expected_result = [{ key: 'jkl', name: 'Joe',  age: 30, gender: 'M' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'abc', name: 'Anna', age: 22, gender: 'F' }];


const lut = new Map(users.map(o => [o.key, o]));

const result = filter.filter(o => lut.has(o.key)).map(f => lut.get(f.key));

console.log(result);


查看完整回答
反對 回復 2023-03-24
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

const users = [ 

  { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 

  { key: 'def', name: 'John', age: 25, gender: 'M' },

  { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },

  { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 


const filter = [ 

  { key: 'jkl' },

  { key: 'def' },

  { key: 'abc' },


function sort(user, filter) {

  var results = [];

  filter.forEach(obj => {

      user.forEach(obj2 => {

          if (obj.key == obj2.key) {

            results.push(obj2);

}

          })

      })

return results;

  }

  console.log(sort(users, filter))


查看完整回答
反對 回復 2023-03-24
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

一個非常有效的解決方案是將數組轉換filter為地圖,然后使用它來過濾用戶:


const users = [ 

  { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 

  { key: 'def', name: 'John', age: 25, gender: 'M' },

  { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },

  { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 


const filter = [ 

  { key: 'jkl' },

  { key: 'def' },

  { key: 'abc' },


const keys = Object.values(filter).reduce((acc, cur) => { acc[cur.key] = true; return acc; }, {});

const result = users.filter(user => keys[user.key]);


console.log(result);


查看完整回答
反對 回復 2023-03-24
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

您可以嘗試這種方法:

邏輯:

  • filters使用簽名創建地圖:<key>: <index>

  • users使用具有索引的對象過濾數組filterIndex

  • 使用存儲在中的索引對該過濾后的數組進行排序filterIndex

const users = [ { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'ghi', name: 'Mary', age: 27, gender: 'F' }, { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } ] 


const filter = [ { key: 'jkl' }, { key: 'def' }, { key: 'abc' }, ];


const filterIndex = filter.reduce((acc, filterObj, index) => {

  acc[filterObj.key] = index;

  return acc;

}, {})


const result = users

  .filter(({ key }) => filterIndex[key] !== undefined)

  .sort((a, b) => {

    return filterIndex[ a.key ] - filterIndex[ b.key ]

  });


console.log(result)


查看完整回答
反對 回復 2023-03-24
  • 4 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號