简体   繁体   中英

Javascript reduce array of objects by mutual value

how can i reduce array of objects to new array of merged objects? I have following array mixed with places and their sub areas. I want to add sub_main_places to main_places like following:

 "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"
    }
  ]

The result im trying to achieve is:

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

Using reduce, you can assemble an object with keys that correspond to the main address, then reference those when you encounter a sub address. At the end, you can convert the result back to an array with 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);

Tried another way:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM