分离数组中的对象并在新数组中为每个 id 按 id 排序
Separate objects in array and sort by id in new array for each id
我有一个包含对象的数组,每个对象都有一个唯一的 ID。我需要根据它们的 ID 将这些对象分开,并创建包含仅具有相同 ID 的对象的新数组。
这是我目前所拥有的..
let fullArray = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}, {
name: 'Tyler',
id: 2
}];
function separateObjectsInArray(fullArray) {
let newArr = [];
fullArray.map((each) => {
newArr.push(each.id);
});
let uniqueIdArr = [...new Set(newArr)];
fullArray.map((eachObj) => {
uniqueArr.map((uniqueId) => {
if (eachObj.id === uniqueId) {
//CREATE NEW ARRAYS WITH MATCHING ID'S
}
})
})
}
separateObjectsInArray(fullArray);
如您所见,我首先绘制了对象数组,然后创建了一个包含 ID 的数组,然后取出所有重复项 (uniqueIdArr)
之后我再次映射 fullArray 并将每个对象的 ID 与 ID 的 uniqueIdArr 进行比较。我坚持如何告诉它为每个 ID 创建一个数组并推送匹配的对象。
let finalArray1 = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}];
let finalArray2 = [{
name: 'Tyler',
id: 2
}];
或者甚至一个数组与数组也可以!
let finalArray = [[{name: 'Tyler', id: 2 }], [{ name: 'John', id: 1},{
name: 'Lucy', id: 1 }]];
您可以使用reduce
构建一个由id
键控的Map,最后从该数组中取出值以形成一个新的数组数组:
function group(arr, key) {
return [...arr.reduce( (acc, o) =>
acc.set(o[key], (acc.get(o[key]) || []).concat(o))
, new Map).values()];
}
const fullArray = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}, {
name: 'Tyler',
id: 2
}];
const result = group(fullArray, 'id');
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您可以使用 lodash,这里有另一个解决方案。
let fullArray = [
{ name: 'John', id: 1 },
{ name: 'Sarah', id: 2 },
{ name: 'Lucy', id: 1 },
{ name: 'Tyler', id: 2 }];
const grouped = _.groupBy(fullArray, "id");
console.log(Object.keys(grouped).map((key) => grouped[key]));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
希望对您有所帮助。
我有一个包含对象的数组,每个对象都有一个唯一的 ID。我需要根据它们的 ID 将这些对象分开,并创建包含仅具有相同 ID 的对象的新数组。
这是我目前所拥有的..
let fullArray = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}, {
name: 'Tyler',
id: 2
}];
function separateObjectsInArray(fullArray) {
let newArr = [];
fullArray.map((each) => {
newArr.push(each.id);
});
let uniqueIdArr = [...new Set(newArr)];
fullArray.map((eachObj) => {
uniqueArr.map((uniqueId) => {
if (eachObj.id === uniqueId) {
//CREATE NEW ARRAYS WITH MATCHING ID'S
}
})
})
}
separateObjectsInArray(fullArray);
如您所见,我首先绘制了对象数组,然后创建了一个包含 ID 的数组,然后取出所有重复项 (uniqueIdArr) 之后我再次映射 fullArray 并将每个对象的 ID 与 ID 的 uniqueIdArr 进行比较。我坚持如何告诉它为每个 ID 创建一个数组并推送匹配的对象。
let finalArray1 = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}];
let finalArray2 = [{
name: 'Tyler',
id: 2
}];
或者甚至一个数组与数组也可以!
let finalArray = [[{name: 'Tyler', id: 2 }], [{ name: 'John', id: 1},{
name: 'Lucy', id: 1 }]];
您可以使用reduce
构建一个由id
键控的Map,最后从该数组中取出值以形成一个新的数组数组:
function group(arr, key) {
return [...arr.reduce( (acc, o) =>
acc.set(o[key], (acc.get(o[key]) || []).concat(o))
, new Map).values()];
}
const fullArray = [{
name: 'John',
id: 1
}, {
name: 'Lucy',
id: 1
}, {
name: 'Tyler',
id: 2
}];
const result = group(fullArray, 'id');
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果您可以使用 lodash,这里有另一个解决方案。
let fullArray = [
{ name: 'John', id: 1 },
{ name: 'Sarah', id: 2 },
{ name: 'Lucy', id: 1 },
{ name: 'Tyler', id: 2 }];
const grouped = _.groupBy(fullArray, "id");
console.log(Object.keys(grouped).map((key) => grouped[key]));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
希望对您有所帮助。