英文:
Split an array of objects into smaller arrays based on the arrays of ids Javascript
问题
Here is the translated code snippet for your request:
我有一个初始对象数组和2个ID数组,如下所示:
```javascript
const arr = [
{ id: 1, name: "John" },
{ id: 7, name: "Alice" },
{ id: 10, name: "Ken" },
{ id: 5, name: "Bob" },
{ id: 2, name: "Kevin" },
{ id: 6, name: "Tony" },
{ id: 3, name: "Harry" },
{ id: 4, name: "Kyle" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
];
const list1 = [1, 4, 2];
const list2 = [3, 8, 9, 10];
我想要的是arr
的两个新子数组,包括具有list1
和list2
中相应ID的对象。请注意,两个新子数组中对象的顺序必须与list1
和list2
中ID的顺序相同。
我已经尝试了下面的方法,它可以工作,但在arr
中有大量项的情况下可能不太有效:
const subArr1 = [];
const subArr2 = [];
list1.forEach((id) => {
const idx = arr.findIndex((item) => item.id === id);
if (idx !== -1 && subArr1.findIndex((item) => item.id === id) === -1) {
subArr1.push(arr[idx]);
}
});
list2.forEach((id) => {
const idx = arr.findIndex((item) => item.id === id);
if (idx !== -1 && subArr2.findIndex((item) => item.id === id) === -1) {
subArr2.push(arr[idx]);
}
});
/* 结果:
subArr1 = [
{ id: 1, name: "John" },
{ id: 4, name: "Kyle" },
{ id: 2, name: "Kevin" },
];
subArr2 = [
{ id: 3, name: "Harry" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
{ id: 10, name: "Ken" },
];
*/
除了我的想法,是否有更好的解决方案?
更新:
Array.prototype.filter()
和Array.prototype.includes()
可用于创建2个新的子数组,但顺序也应与list1
和list2
中的ID顺序相同。
英文:
I have an initial array of objects and 2 arrays of ids as following:
const arr = [
{ id: 1, name: "John" },
{ id: 7, name: "Alice" },
{ id: 10, name: "Ken" },
{ id: 5, name: "Bob" },
{ id: 2, name: "Kevin" },
{ id: 6, name: "Tony" },
{ id: 3, name: "Harry" },
{ id: 4, name: "Kyle" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
];
const list1 = [1, 4, 2];
const list2 = [3, 8, 9, 10];
What I want is 2 new sub arrays of arr
which include the objects having the respective id in list1
and list2
. Notice that the order of objects of two new sub arrays must be as the same order of ids in list1
and list2
.
I have tried the below way, it works but may not be effective with a large number of items in arr
:
const subArr1 = [];
const subArr2 = [];
list1.forEach((id) => {
const idx = arr.findIndex((item) => item.id === id);
if (idx !== -1 && subArr1.findIndex((item) => item.id === id) === -1) {
subArr1.push(arr[idx]);
}
});
list2.forEach((id) => {
const idx = arr.findIndex((item) => item.id === id);
if (idx !== -1 && subArr2.findIndex((item) => item.id === id) === -1) {
subArr2.push(arr[idx]);
}
});
/* Result:
subArr1 = [
{ id: 1, name: "John" },
{ id: 4, name: "Kyle" },
{ id: 2, name: "Kevin" },
];
subArr2 = [
{ id: 3, name: "Harry" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
{ id: 10, name: "Ken" },
];
*/
Beside my idea, is there any better solution?
Updated:
The Array.prototype.filter()
and Array.prototype.includes()
works to create 2 new sub arrays but the order also should be the same as order of ids in list1
and list2
答案1
得分: 0
const subArr1 = list1.map((id) => arr.find((item) => item.id === id));
const subArr2 = list2.map((id) => arr.find((item) => item.id === id));
英文:
const subArr1 = list1.map((id) => arr.find((item) => item.id === id));
const subArr2 = list2.map((id) => arr.find((item) => item.id === id));
答案2
得分: 0
这段代码包含一个名为arr的数组,其中包含具有id和name属性的对象。还有两个额外的数组list1和list2,它们包含一些ID。
代码的目标是基于list1和list2中的ID来过滤arr数组,从而得到两个子数组:subArr1和subArr2。
以下是解决方案的逐步说明:
- 初始化一个空数组subArr1,用于存储根据list1中的ID过滤出的对象。
- 在arr数组上使用filter方法来迭代每个对象。
- 对于每个对象,使用includes方法检查其id是否存在于list1中。
- 如果对象的id在list1中存在,它将返回true,并被包含在subArr1数组中。
- 重复相同的步骤,通过根据list2中的ID过滤arr来创建subArr2。
执行完代码后,subArr1将包含具有ID 1、4和2的arr中的对象,而subArr2将包含具有ID 3、8、9和10的对象。
通过使用filter方法和includes方法,我们可以轻松地基于特定的ID来过滤对象数组,并将过滤后的对象存储在单独的子数组中。
英文:
const arr = [
{ id: 1, name: 'John' },
{ id: 7, name: 'Alice' },
{ id: 10, name: 'Ken' },
{ id: 5, name: 'Bob' },
{ id: 2, name: 'Kevin' },
{ id: 6, name: 'Tony' },
{ id: 3, name: 'Harry' },
{ id: 4, name: 'Kyle' },
{ id: 8, name: 'Jane' },
{ id: 9, name: 'Sam' },
];
const list1 = [1, 4, 2];
const list2 = [3, 8, 9, 10];
const subArr1 = arr.filter((item) => list1.includes(item.id));
const subArr2 = arr.filter((item) => list2.includes(item.id));
console.log({
subArr1,
subArr2,
});
/**
* Output:
* {
subArr1: [
{ id: 1, name: 'John' },
{ id: 2, name: 'Kevin' },
{ id: 4, name: 'Kyle' }
],
subArr2: [
{ id: 10, name: 'Ken' },
{ id: 3, name: 'Harry' },
{ id: 8, name: 'Jane' },
{ id: 9, name: 'Sam' }
]
}
*/
in above code consists of an array arr containing objects with id and name properties. There are also two additional arrays, list1 and list2, which contain some IDs.
The goal of the code is to filter the arr array based on the IDs present in list1 and list2, resulting in two sub-arrays: subArr1 and subArr2.
Here's a step-by-step breakdown of the solution:
- Initialize an empty array subArr1 to store the filtered objects from arr based on the IDs in list1.
- Use the filter method on the arr array to iterate over each object.
- For each object, use the includes method on list1 to check if the id - of the object exists in list1.
- If the object's id is present in list1, it will return true and be included in the subArr1 array.
- Repeat the same steps to create subArr2 by filtering arr based on the IDs in list2.
After executing the code, subArr1 will contain the objects from arr with IDs 1, 4, and 2, while subArr2 will contain the objects with IDs 3, 8, 9, and 10.
By using the filter method and the includes method, we can easily filter the array of objects based on specific IDs and store the filtered objects in separate sub-arrays.
答案3
得分: 0
以下是您要的中文翻译部分:
这是一个解决方案:
```javascript
const filterByIds = (arr, ids) => ids.map(id => arr.find(e => e.id === id)).filter(e => e);
当您不希望在列表中找不到ID时出现undefined
时,.filter(e => e)
是可选的。
const arr = [
{ id: 1, name: "John" },
{ id: 7, name: "Alice" },
{ id: 10, name: "Ken" },
{ id: 5, name: "Bob" },
{ id: 2, name: "Kevin" },
{ id: 6, name: "Tony" },
{ id: 3, name: "Harry" },
{ id: 4, name: "Kyle" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
];
const list1 = [1, 4, 2];
const list2 = [3, 8, 9, 10];
const filterByIds = (arr, ids) => ids.map(id => arr.find(e => e.id === id)).filter(e => e);
const arr1 = filterByIds(arr, list1);
console.log(arr1);
const arr2 = filterByIds(arr, list2);
console.log(arr2);
希望这有所帮助!
英文:
Here's a solution:
const filterByIds = (arr, ids) => ids.map(id => arr.find(e => e.id === id)).filter(e => e);
The .filter(e => e)
is optional if you don't want undefined
in your list when the id is not found.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const arr = [
{ id: 1, name: "John" },
{ id: 7, name: "Alice" },
{ id: 10, name: "Ken" },
{ id: 5, name: "Bob" },
{ id: 2, name: "Kevin" },
{ id: 6, name: "Tony" },
{ id: 3, name: "Harry" },
{ id: 4, name: "Kyle" },
{ id: 8, name: "Jane" },
{ id: 9, name: "Sam" },
];
const list1 = [1, 4, 2];
const list2 = [3, 8, 9, 10];
const filterByIds = (arr, ids) => ids.map(id => arr.find(e => e.id === id)).filter(e => e);
const arr1 = filterByIds(arr, list1);
console.log(arr1);
const arr2 = filterByIds(arr, list2);
console.log(arr2);
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论