【问题标题】:how to loop through nested objects and push fields after comparing them in javascript/es6在javascript / es6中比较嵌套对象后如何循环嵌套对象并推送字段
【发布时间】:2020-11-03 06:44:39
【问题描述】:

从下面的数据结构中,我有以下 3 项:

  • 假设group 有三个字段:idnameaccountNumber,因为我有三个项目,所以其中两个具有相同的accountNumber

我想做什么

我想用javascript/es6 编写一个函数来循环这些对象,检查group 中的idaccountNumber 并将其推入一个名为results 的新对象数组中。 (如果任何 id 包含相同的accountnumber,则不应将其推送到下面的新数组中)

# new array 
# results = [
{
    id: 1,
    accountNumber: 2289,
  },
  {
    id: 2,
    accountNumber: 9920,
  },
]

由于我在python 的背景,我正在努力实现这一目标。任何帮助都会非常有帮助。

【问题讨论】:

  • 当您想从现有数组创建新数组时,我建议使用map()

标签: javascript reactjs react-native ecmascript-6 ecmascript-5


【解决方案1】:

假设所有其他数据对象属性都不相关,并且我正确地表示了您的数据(图像被裁剪):

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)

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我完美运行!
【解决方案2】:

这个例子应该让您了解如何过滤相同的帐号

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)

【讨论】:

    【解决方案3】:

    您实际上可以通过使用Map 来更简洁地实现这一点。

    按照设计,Map 每个键只有一个值,因此我们可以按 accountNumber 进行索引,这样可以更快地检查是否再次出现。

    另外,Map.set() 返回整个 Map,在 Array.reduce() 函数中使用时会派上用场,因为我们总是必须在其中返回累加器。

    使用字典 (Object) 也可以达到同样的目的 - 请参阅第二个 sn-p - 但在 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))

    【讨论】:

      【解决方案4】:

      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)

      或者单线

      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)

      【讨论】:

        【解决方案5】:

        您也可以像这样不将整个推送到数组部分:返回数组上过滤器的结果。过滤器将只返回索引是具有相同帐号的元素的第一个索引的元素:

        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);
        

        【讨论】:

          猜你喜欢
          • 2020-11-30
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 1970-01-01
          • 2018-03-23
          • 2017-01-22
          • 1970-01-01
          相关资源
          最近更新 更多