如何循环遍历嵌套对象并在 javascript/es6 中比较它们后推送字段

how to loop through nested objects and push fields after comparing them in javascript/es6

我从下面的数据结构中得到以下 3 项:

我想做什么

我想用 javascript/es6 编写一个函数来循环遍历这些对象,检查 group 中的 idaccountNumber 并将其推送到一个新数组中名为 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);