我有 2 個帶有物件的陣列。
const users1 = [
{ name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' },
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
],
const users2 = [
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
],
我需要從users1中包含的那些部分獲取索引users2。
結果我應該得到[{1: true}, {3: true}]. 我以這種方式嘗試,但它不正確
const arr = user1.filter((item, index) => user2.map(i) => {
if(i.id === item.id) return {index: true}
return null;
})
uj5u.com熱心網友回復:
Set您可以從所有 id 中創建一個users2(一個 Set 有點像一個陣列,但允許您快速檢查一個值是否在其中使用.has()并且它只存盤唯一值)。獲得集合后,您可以使用.reduce()創建一個新陣列,.concat()如果集合具有來自的物件的 id,則可以在其中使用users1:
const users1 = [{ id: 1, name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' }, { id: 2, name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { id: 3, name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' }, { id: 4, name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ];
const users2 = [{ id: 2, name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { id: 4, name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ];
const u2Ids = new Set(users2.map(user => user.id));
const res = users1.reduce((acc, obj, i) => u2Ids.has(obj.id) ? acc.concat({[i]: true}) : acc, []);
console.log(res);
創建物件時,您需要確保在將索引添加為鍵時使用計算屬性名稱{[i]: true},以便使用值 ati而不是文字i名稱。上面的代碼也可以用for..of回圈(通過訪問Array.prototype.entries())來撰寫,這樣更有效并且(在我看來)更具可讀性:
const users1 = [{ id: 1, name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' }, { id: 2, name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { id: 3, name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' }, { id: 4, name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ];
const users2 = [{ id: 2, name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' }, { id: 4, name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }, ];
const res = [];
const u2Ids = new Set(users2.map(user => user.id));
for(const [i, obj] of users1.entries()) {
if(u2Ids.has(obj.id))
res.push({[i]: true});
}
console.log(res);
uj5u.com熱心網友回復:
首先,您的陣列不包含我現在過濾的名稱的 id。如果您使用過濾器將只過濾您的陣列并且索引將不再相同,那么過濾器將在 bcs 中不起作用,請嘗試以下操作
const users1 = [
{ name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' },
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }
];
const users2 = [
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' }
];
const arr = [];
users1.forEach((item, idx) =>{
if(users2.some(u=> u.name == item.name)){
arr.push({[idx]:true})
}
});
console.log(arr)
uj5u.com熱心網友回復:
只是另一種方法 - 與Array.reduce()
const users1 = [
{ name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' },
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
];
const users2 = [
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
];
const arr = users1.
reduce((previousValue, currentValue, index) => {
// change here to find by id
if (users2.some(u2 => u2.name === currentValue.name) ){
// map to whatever you want
const valueToSave = {[index] : true};
return [...previousValue, valueToSave];
} else {
return previousValue;
}
}, []);
console.log(arr);
uj5u.com熱心網友回復:
@festina,為了簡單起見,我們在 users2 上進行映射,因為我們試圖在 users2 中查找 users1 的物件,我們使用 findIndex 使用(id/name 任何可用的唯一鍵)獲取索引,然后按索引 > 0 過濾,并格式化產生所需的格式
const users1 = [
{ name: 'John', age: 15, gender: 'M', city: 'London', country: 'UK' },
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Jinny', age: 30, gender: 'F', city: 'London', country: 'UK' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
];
const users2 = [
{ name: 'Jack', age: 20, gender: 'M', city: 'New York', country: 'USA' },
{ name: 'Key', age: 15, gender: 'M', city: 'Leeds', country: 'UK' },
];
// your solution
const result = users2.map((user, index) => users1.findIndex(u => u.name === user.name))
.filter(index => index > 0)
.map((i => { return { [i]: true} }));
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524745.html
