4 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以將您的第一個(gè)用戶數(shù)組轉(zhuǎn)換為Map
. Map 類似于對象,但是,它有一些差異(我在這里使用 Map,因?yàn)榕c對象相比,它更容易從數(shù)組構(gòu)造)。
地圖將具有以下形狀:
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 存儲在一個(gè)名為lut(look-up-table 的縮寫)的變量中。這樣做lut.get("def")將返回存儲在 key 中的對象"def",在這種情況下該對象是:
{ key: 'def', name: 'John', age: 25, gender: 'M' }
JavaScript 引擎優(yōu)化了這種查找,使其非常高效,因此創(chuàng)建這樣的 Map 有助于提高整體可伸縮性,這意味著如果您有很多用戶,它會很高效。
由于輸出中的順序很重要,因此您可以使用.map()數(shù)組filter(決定順序)將具有 name 屬性的每個(gè)對象轉(zhuǎn)換為我們構(gòu)建的 Map 中的對象。要執(zhí)行“轉(zhuǎn)換”,您可以返回所需的新對象,您可以使用.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);
如果過濾器中的某個(gè)對象可以具有不在用戶列表中的用戶的鍵,則上述方法會將過濾器對象轉(zhuǎn)換為“未定義”。如果你想忽略它,你可以.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);

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
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))

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
一個(gè)非常有效的解決方案是將數(shù)組轉(zhuǎn)換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);

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
您可以嘗試這種方法:
邏輯:
filters
使用簽名創(chuàng)建地圖:<key>: <index>
users
使用具有索引的對象過濾數(shù)組filterIndex
使用存儲在中的索引對該過濾后的數(shù)組進(jìn)行排序
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)
添加回答
舉報(bào)