簡體   English   中英

創建新城市 state object

[英]create new city state object

我想將我的初始數據轉換為所需的結果,我正在努力將城市推入數組並確保名稱鍵是唯一的。

初始數據

[
  { "city": "Abbeville", "state": "Louisiana" },
  { "city": "Aberdeen", "state": "Maryland" },
  { "city": "Aberdeen", "state": "Mississippi" },
  { "city": "Aberdeen", "state": "South Dakota" },
  { "city": "Aberdeen", "state": "Washington" },
  { "city": "Abilene", "state": "Texas" },
  { "city": "Abilene", "state": "Kansas" },
  { "city": "Abingdon", "state": "Virginia" },
  { "city": "Abington", "state": "Massachusetts" },
  { "city": "Abington", "state": "Massachusetts" },
]

代碼

 let newCityStateObject = cities.map((item, index) => {
        console.log("item ", item);
  if (item) {
    let object = {};
    let citiesArray = [];

    //set state and create empty array
    if (object[item.state] === undefined) {
      object.name = item.state;
      object.cities = [].push(item.city);
    } else {
      //key exists so just push to array
      if (object[item.state]) {
        object.cities.push(item.city);
      }
    }

    console.log("end ", object);
    return object;
  }
    });

我現在的結果

[
  { state: 'Louisiana', cities: [] },
  { state: 'Maryland', cities: [] },
  { state: 'Mississippi', cities: [] },
  { state: 'South Dakota', cities: [] },
  { state: 'Washington', cities: [] },
  { state: 'Texas', cities: [] },
  { state: 'Kansas', cities: [] },
  { state: 'Virginia', cities: [] },
]

期望的結果

[
{
    "name": "Kentucky",
    "cities": [
      "Louisville/Jefferson County",
      "Lexington-Fayette",
      "Bowling Green",
      "Owensboro",
      "Covington"
    ]
  },
  {
    "name": "Maryland",
    "cities": [
      "Baltimore",
      "Frederick",
      "Rockville",
      "Gaithersburg",
      "Bowie",
      "Hagerstown",
      "Annapolis"
    ]
  }
]

任何幫助/提示或指向解決此問題的正確方向將不勝感激。

您基本上是按 state 對城市進行分組。首先, array.map不是解決此問題的正確方法,因為當您分組時,輸入項的編號可能與輸出項的編號不匹配。 array.reduce是更好的選擇。

let newCityStateObject = cities.reduce((acc, item, index) => {
  if (item) {
    // this object has state as key, and the desired output array’s item as value
    const object = acc.obj;

    // if state not found, create new record
    if (object[item.state] === undefined) {
      const record = { name: item.state, cities: [] }
      object[item.state] = record;
      acc.array.push(record);
    }

    const record = object[item.state];
    record.cities.push(item.city);
  }
  return acc;
}, { obj: {}, array: [] }).array;

我喜歡@hackape 建議的答案。

這是另一種要考慮的方法:

let newCityStateObject = () => {
    const statesArr = Array.from(cities, (item) => item.state);
    // Remove state duplications
    const filteredStates = [...new Set(statesArr)];
    // Initializing the name and cities object and array
    let result = filteredStates.map((item) => {
      return { name: item, cities: [] };
    });

    // For each cite item, fetch the city to its corresponding result by state
    cities.forEach((item) =>
      result
        .find((element) => element.name === item.state)
        .cities.push(item.city)
    );
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM