【问题标题】:Javascript reduce array of objects by mutual valueJavascript通过互值减少对象数组
【发布时间】:2021-09-27 05:55:12
【问题描述】:

如何将对象数组减少为新的合并对象数组? 我将以下数组与地点及其子区域混合在一起。我想将 sub_main_places 添加到 main_places,如下所示:

 "unformatted places": [
    {
      "name": "main_place1",
      "address": "place_address1"
    },
    {
      "name": "main_place2",
      "address": "place_address2"
    },
    {
      "name":"sub_main_place1",
      "address":"sub_main_place_address1"
    },
    {
      "name":"sub_main_place2",
      "address":"sub_main_place_address2"
    }
  ]

我试图达到的结果是:

  "formatted places": [
    {
      "name": "main_place1",
      "address": "place_address1",
      "sub_area": "sub_main_place1"
    },
    {
      "name": "main_place2",
      "address": "place_address2",
      "sub_area": "sub__main_place2"
    }
  ],

【问题讨论】:

  • 您认为如何实现这一目标?你尝试了什么
  • 真正的值是否真的以数字12 等结尾?如果不是,您将如何判断这些值应该如何分组?
  • 是的,末尾有数字,但是有错字,应该在数字前加下划线...想法是 split('_').pop() 并比较数字,因为数字始终是一个共同因素,那么如果数字匹配格式新对象。但从那里我不知道。

标签: javascript reduce


【解决方案1】:

使用reduce,您可以使用与主地址对应的键组装对象,然后在遇到子地址时引用这些键。最后,您可以使用 Object.values 将结果转换回数组

let unformatted_places = [{
    "name": "main_place1",
    "address": "place_address1"
  },
  {
    "name": "main_place2",
    "address": "place_address2"
  },
  {
    "name": "sub_main_place1",
    "address": "sub_main_place_address1"
  },
  {
    "name": "sub_main_place2",
    "address": "sub_main_place_address2"
  }
]

let formatted_places = Object.values(unformatted_places
  .sort((a, b) => a.name.localeCompare(b.name))
  .reduce((b, a) => {
    let f = a.name.split('sub_')[1]
    if (a.name.indexOf('sub_') === 0 && b[f]) {
      b[f].sub_area = a.name;
    } else {
      b[a.name] = a;
    }
    return b;
  }, {}))

console.log(formatted_places);

【讨论】:

    【解决方案2】:

    尝试了另一种方法:

    let data_1 = {
      "unformatted places": [{
          "name": "main_place1",
          "address": "place_address1"
        },
        {
          "name": "main_place2",
          "address": "place_address2"
        },
        {
          "name": "sub_main_place1",
          "address": "sub_main_place_address1"
        },
        {
          "name": "sub_main_place2",
          "address": "sub_main_place_address2"
        }
      ]
    };
    
    let data_2 = {}
    
    data_1["unformatted places"].forEach(function(dict) {
      var name = dict.name;
      if (name.startsWith("main")) {
        data_2[name] = dict;
      } else if (name.startsWith("sub_")) {
        let key = name.substring(4, name.length);
    
        if (key in data_2) {
          data_2[key]["sub_area"] = name;
        } else {
          data_2[key] = {
            "sub_area": name
          };
        }
    
      }
    });
    data_2 = {
      "formatted places": Object.values(data_2)
    }
    console.log(data_2);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2018-09-01
      • 1970-01-01
      • 2018-10-20
      • 2018-09-25
      • 1970-01-01
      相关资源
      最近更新 更多