我需要通过过滤数据来创建一个新数组。
{
"roles": [
{
"role": "manager",
"test_id": "123"
},
{
"role": "cashier",
"test_id": "123"
},
{
"role": "customer",
"test_id": "123"
},
{
"role": "cashier_2",
"test_id": "500"
}
],
}
我需要过滤这个数组,并使用test_id
创建一个新数组,这是预期的格式。
{
"roles": [
{
"role": [manager, cashier, customer],
"test_id": "123"
},
{
"role": "cashier_2",
"test_id": "500"
}
],
}
我尝试使用filter方法和map方法,但无法获得预期的输出。
let x = [];
const test = userRoles?.map((item, index, element) => {
let next = element[index+1];
if(item?.test_id == next?.test_id){
x.push(item?.role)
}
})
2条答案
按热度按时间gstyhher1#
我不认为
map()
在这里工作,因为它只是将条目Map到(新)条目,但您需要对它们进行分组。这是reduce()
的工作,它允许您从条目中创建任何内容。在这种情况下,在
test_id
和分组条目之间使用一个对象可以很好地进行查找:dwthyt8l2#
要从现有数组创建所需的新数组,可以使用
reduce()
方法迭代角色并按其test_id
分组。对于每个角色,可以检查累加器数组中是否已经存在具有相同test_id
的对象。如果存在,则可以将角色推送到现有对象的role
数组。如果不存在,则可以将角色推送到role
数组。你可以用test_id
创建一个新的对象,并把它推到accumulator数组中,下面的代码可以做到这一点:这应输出:
请注意,代码假设
roles
数组已经按test_id
排序。如果不是这样,您可以首先使用sort()
方法对其进行排序。此外,我已经使用console.log()
显示结果,但您可以从函数返回groupedRoles
数组或根据需要以其他方式使用它。