提问人:Ladizi 提问时间:10/18/2023 最后编辑:Ladizi 更新时间:10/18/2023 访问量:77
想要从数组中查找唯一和重复对象的数量,并以特定方式列出它们
Want to find the amount of unique and duplicate objects from an array and list them in a specific way
问:
[
{ "id":5,
"name": "banana"
},
{ "id":5,
"name": "banana"
},
{ "id":4,
"name": "apple"
},
{ "id":1,
"name": "strawberry"
},
{ "id":1,
"name": "strawberry"
}
]
const arrayMap = new Map(Array.map(i => [i.id, {...i, amount: 0 }]));
我只考虑过一种方法,例如映射数组并使用循环为每个对象分配数量,但我不确定这是否是一种好方法,而且字符串部分仍然是我无法弄清楚的。
订单将按最高 ID 号排序。该数组可以被看作是一个购物车,你可以有多个香蕉,它们只是列在字符串的同一部分下。
如果您有 2 个 ID 为 5 的香蕉、1 个 ID 为 4 的苹果和 2 个 ID 为 1 的草莓,它将显示如下:
然而,在我的例子中,“香蕉”并不是它的独特之处,而是 ID。不会有其他具有不同 ID 的香蕉,它们都将使用相同的 ID 添加为重复对象。
"2x Banana, 1x Apple, 2x Strawberry"
答:
0赞
FatalError
10/18/2023
#1
你可以通过遍历数组来做到这一点。例如
const data = [
{ "id": 1, "name": "item1" },
{ "id": 2, "name": "item1" },
{ "id": 3, "name": "item3" },
{ "id": 4, "name": "xd" }
];
// Create an object to store item counts
const itemCounts = {};
data.forEach((item) => {
const itemName = item.name;
itemCounts[itemName] = (itemCounts[itemName] || 0) + 1;
});
const sortedItems = Object.entries(itemCounts)
.sort((a, b) => b[1] - a[1])
.map(([itemName, count]) => `${count}x ${itemName}`)
.join(' ');
console.log(resultString);
0赞
Phil
10/18/2023
#2
- 按 ID 从高到低对数组进行排序
- 将排序后的数组简化为以 with 和 values 为键的对象。名称冲突(如果有)可以通过先见解决。
id
name
count
- 将这些条目映射到字符串,然后将整个内容连接在一起
const data = [{"id":5,"name":"banana"},{"id":5,"name":"banana"},{"id":4,"name":"apple"},{"id":1,"name":"strawberry"},{"id":1,"name":"strawberry"}];
const capitalise = (str) => str.replace(/\b[a-z]/g, (c) => c.toUpperCase());
const counts = data
.toSorted((a, b) => b.id - a.id) // sort by ID highest to lowest
.reduce((acc, { id, name }) => {
acc[id] ??= {
name,
count: 0,
};
acc[id].count++;
return acc;
}, {});
const str = Object.values(counts)
.map(({ name, count }) => `${count}x ${capitalise(name)}`)
.join(", ");
console.log(str);
如果 Array.prototype.toSorted() 不可用,您可以
- 不关心改变原始数组的顺序,只需使用
Array.prototype.sort()
- 使用 either 中断原始数组引用,然后使用
[...data]
data.slice(0)
.sort()
评论
0赞
Ladizi
10/18/2023
我错过了这是一个 node.js 项目的标签,所以 .toSorted() 不是一个选项。对于混乱,我深表歉意,这是我第一次访问这个网站。
0赞
Phil
10/18/2023
@Ladizi在 Node.js 20.0.0 中可用Array.prototype.toSorted()
0赞
Ladizi
10/18/2023
你提醒我更新 Node.js。对不起,又来了..哈哈
0赞
Phil
10/18/2023
@Ladizi如果您无法升级 Node,我添加了选项.js
0赞
Mahadev Mirasdar
10/18/2023
#3
let data = [{
"id": 5,
"name": "banana"
},
{
"id": 5,
"name": "banana"
},
{
"id": 4,
"name": "apple"
},
{
"id": 1,
"name": "strawberry"
},
{
"id": 1,
"name": "strawberry"
}
];
let obj = {};
function findDuplicate(data) {
data.map((e, i) => {
let {
id,
name
} = e;
let val = 0;
if ([name] in obj) {
obj[name] = obj[name] + 1;
} else {
obj[name] = 1
}
})
let output = '';
let arr = Object.keys(obj);
for (let x in obj) {
if (arr.slice(-1) == x) {
output += `${obj[x]}x ${x.charAt(0).toUpperCase() + x.slice(1)}`
} else {
output += `${obj[x]}x ${x.charAt(0).toUpperCase() + x.slice(1)}, `;
}
}
return output;
}
console.log(findDuplicate(data));
评论
name
id