如何循环遍历嵌套对象并在 javascript/es6 中比较它们后推送字段
how to loop through nested objects and push fields after comparing them in javascript/es6
我从下面的数据结构中得到以下 3 项:
- 假设
group
有三个字段:id
、name
、accountNumber
因为我有三个项目,所以其中两个具有相同的 accountNumber
.
我想做什么
我想用 javascript/es6
编写一个函数来循环遍历这些对象,检查 group
中的 id
和 accountNumber
并将其推送到一个新数组中名为 results
的对象。
(如果任何 id 包含相同的 accountnumber
,则不应将其推送到下面的新数组)
# new array
# results = [
{
id: 1,
accountNumber: 2289,
},
{
id: 2,
accountNumber: 9920,
},
]
由于我在 python
的背景,我正在努力实现这一目标。任何帮助都会很有帮助。
假设所有其他数据对象属性都不相关,并且我正确地表示了您的数据(图像被裁剪):
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const result = data.reduce((result, obj) => {
if(result.some(ele => ele.accountNumber === obj.group.accountNumber)) return result;
result.push({id: obj.group.id, accountNumber: obj.group.accountNumber});
return result;
}, []);
//will filter out id 3 since it has same accountNumber as id 1
console.log(result)
此示例应该让您了解如何过滤相同的帐号
data=[{id:2, name:"foo", accountNumber:20209393},{id:2, name:"bar", accountNumber:2020559393},{id:2, name:"foo", accountNumber:20209393}]
result=data.reduce((acc,curr)=>{
if(acc.length==0) {acc.push(curr)}
else {
acc.some(o => {
if(o.accountNumber==curr.accountNumber){
return acc
}
else acc.push(curr)
})
}
return acc
},[])
console.log(result)
您实际上可以通过使用 Map
.
来更简洁地实现这一点
根据设计,Map
每个键只有一个值,因此我们可以按 accountNumber 进行索引,这样可以更快地检查是否再次出现。
此外,Map.set()
return 是整个 Map,在 Array.reduce()
函数中使用时会派上用场,因为我们总是必须 return 此类中的累加器.
同样可以使用字典来实现 (Object
) - 请参阅第二个片段 - 但在 Array.reduce()
函数中使用时,字典不如 Map 方便。
使用地图:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => result.get(obj.group.accountNumber);
const result = data.reduce((result, obj) => !exists(result, obj) ? result.set(obj.group.accountNumber, {id: obj.group.id, accountNumber: obj.group.accountNumber}) : result, new Map())
console.log([...result.values()])
使用字典:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => !!result[obj.group.accountNumber];
const result = data.reduce((result, obj) => {
result[obj.group.accountNumber] = !exists(result, obj) ? {id: obj.group.id, accountNumber: obj.group.accountNumber} : result[obj.group.accountNumber];
return result;
}, {});
console.log(Object.values(result))
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}},
{group: {id: 2, name:"name2", accountNumber: 5678}},
{group: {id: 3, name:"name3", accountNumber: 9101}},
{group: {id: 4, name:"name4", accountNumber: 1213}},
{group: {id: 5, name:"name5", accountNumber: 1415}},
]
const result = []
data.map(v => {
const {id} = v.group;
const {accountNumber} = v.group
result.push({id, accountNumber})
})
console.log(result)
或 one-liner
const data = [{
group: {
id: 1,
name: "name1",
accountNumber: 1234
}
},
{
group: {
id: 2,
name: "name2",
accountNumber: 5678
}
},
{
group: {
id: 3,
name: "name3",
accountNumber: 9101
}
},
{
group: {
id: 4,
name: "name4",
accountNumber: 1213
}
},
{
group: {
id: 5,
name: "name5",
accountNumber: 1415
}
},
]
const result = []
data.map(v => result.push({
id: v.group.id,
accountNumber: v.group.accountNumber
}))
console.log(result)
您也可以不将整个推送到数组部分,如下所示:return 数组过滤器的结果。过滤器将 return 仅索引为具有相同帐号的元素的第一个索引的元素:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const result =
data.filter((element, index, array) => index == array.findIndex((elm)=>
element.group.accountNumber == elm.group.accountNumber));
console.log(result);
我从下面的数据结构中得到以下 3 项:
- 假设
group
有三个字段:id
、name
、accountNumber
因为我有三个项目,所以其中两个具有相同的accountNumber
.
我想做什么
我想用 javascript/es6
编写一个函数来循环遍历这些对象,检查 group
中的 id
和 accountNumber
并将其推送到一个新数组中名为 results
的对象。
(如果任何 id 包含相同的 accountnumber
,则不应将其推送到下面的新数组)
# new array
# results = [
{
id: 1,
accountNumber: 2289,
},
{
id: 2,
accountNumber: 9920,
},
]
由于我在 python
的背景,我正在努力实现这一目标。任何帮助都会很有帮助。
假设所有其他数据对象属性都不相关,并且我正确地表示了您的数据(图像被裁剪):
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const result = data.reduce((result, obj) => {
if(result.some(ele => ele.accountNumber === obj.group.accountNumber)) return result;
result.push({id: obj.group.id, accountNumber: obj.group.accountNumber});
return result;
}, []);
//will filter out id 3 since it has same accountNumber as id 1
console.log(result)
此示例应该让您了解如何过滤相同的帐号
data=[{id:2, name:"foo", accountNumber:20209393},{id:2, name:"bar", accountNumber:2020559393},{id:2, name:"foo", accountNumber:20209393}]
result=data.reduce((acc,curr)=>{
if(acc.length==0) {acc.push(curr)}
else {
acc.some(o => {
if(o.accountNumber==curr.accountNumber){
return acc
}
else acc.push(curr)
})
}
return acc
},[])
console.log(result)
您实际上可以通过使用 Map
.
根据设计,Map
每个键只有一个值,因此我们可以按 accountNumber 进行索引,这样可以更快地检查是否再次出现。
此外,Map.set()
return 是整个 Map,在 Array.reduce()
函数中使用时会派上用场,因为我们总是必须 return 此类中的累加器.
同样可以使用字典来实现 (Object
) - 请参阅第二个片段 - 但在 Array.reduce()
函数中使用时,字典不如 Map 方便。
使用地图:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => result.get(obj.group.accountNumber);
const result = data.reduce((result, obj) => !exists(result, obj) ? result.set(obj.group.accountNumber, {id: obj.group.id, accountNumber: obj.group.accountNumber}) : result, new Map())
console.log([...result.values()])
使用字典:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => !!result[obj.group.accountNumber];
const result = data.reduce((result, obj) => {
result[obj.group.accountNumber] = !exists(result, obj) ? {id: obj.group.id, accountNumber: obj.group.accountNumber} : result[obj.group.accountNumber];
return result;
}, {});
console.log(Object.values(result))
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}},
{group: {id: 2, name:"name2", accountNumber: 5678}},
{group: {id: 3, name:"name3", accountNumber: 9101}},
{group: {id: 4, name:"name4", accountNumber: 1213}},
{group: {id: 5, name:"name5", accountNumber: 1415}},
]
const result = []
data.map(v => {
const {id} = v.group;
const {accountNumber} = v.group
result.push({id, accountNumber})
})
console.log(result)
或 one-liner
const data = [{
group: {
id: 1,
name: "name1",
accountNumber: 1234
}
},
{
group: {
id: 2,
name: "name2",
accountNumber: 5678
}
},
{
group: {
id: 3,
name: "name3",
accountNumber: 9101
}
},
{
group: {
id: 4,
name: "name4",
accountNumber: 1213
}
},
{
group: {
id: 5,
name: "name5",
accountNumber: 1415
}
},
]
const result = []
data.map(v => result.push({
id: v.group.id,
accountNumber: v.group.accountNumber
}))
console.log(result)
您也可以不将整个推送到数组部分,如下所示:return 数组过滤器的结果。过滤器将 return 仅索引为具有相同帐号的元素的第一个索引的元素:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const result =
data.filter((element, index, array) => index == array.findIndex((elm)=>
element.group.accountNumber == elm.group.accountNumber));
console.log(result);