Как зациклить данные JSON и объединить строки с одинаковым идентификатором состояния? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть файл .json us-senat, в котором есть два сенатора для каждого штата.Я хотел бы зациклить этот файл JSON и создать новый объект JS, который должен иметь идентификатор состояния в качестве ключа, а затем установить два свойства для каждого ключа name1 и name2.Вот пример того, как данные выглядят в оригинальном файле:

var senatorData = [{
    state_code: "AK",
    name: "Daniel Sullivan"
  },
  {
    state_code: "AK",
    name: "Lisa Murkowski"
  },
  {
    state_code: "WY",
    name: "Michael Enzi"
  },
  {
    state_code: "WY",
    name: "John Barrasso"
  }
];

$(document).ready(function(){
  loadData();
});

function loadData() {
  if (senatorData) {
    for (var key in senatorData) {
      console.log(senatorData[key]);
    }
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

В примере я только что показал исходные данные, вот что я хотел бы получить:

var senatorDataNew = [
    "AK" = {
         name1: "Daniel Sullivan",
         name2: "Lisa Murkowski"
     },
     "WY" = {
         name1: "Michael Enzi",
         name2: "John Barrasso"
     }
];

Во время цикла я бы установилновый ключ и установите свойство name1 со значением, если ключ уже существует, мне нужно сохранить name1 и установить второе свойство name2 с новым значением.Мне интересно, возможно ли это и как проще всего этого достичь?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

var senatorData = [{
    state_code: "AK",
    name: "Daniel Sullivan"
  },
  {
    state_code: "AK",
    name: "Lisa Murkowski"
  },
  {
    state_code: "WY",
    name: "Michael Enzi"
  },
  {
    state_code: "WY",
    name: "John Barrasso"
  }
];

//convert the object into an object of key (state) and value (names)
senatorData = senatorData.reduce(function(results, senator){
  if (!results[senator.state_code]) results[senator.state_code] = [];
  
  results[ senator.state_code ].push(senator.name);
  return results;
}, {});

console.log(senatorData);

//convert the object into an array of objects
senatorData = Object.keys(senatorData).map(function(state){
  return { state_code: state, names: senatorData[state] };
});

console.log(senatorData);
0 голосов
/ 03 декабря 2018

Если имеется только 2 сенатора, вы можете использовать reduce и установить свойство name1 или name2 в объекте рядом с ключом, основываясь на том, присутствует или нет ключ в аккумуляторе:

function loadData() {
  if (senatorData) {
    return senatorData.reduce((a, {state_code, name}) => {
      if (state_code in a) a[state_code].name2 = name;
      else a[state_code] = {name1: name};
      return a;
    }, {});
  }
}

var senatorData = [{
    state_code: "AK",
    name: "Daniel Sullivan"
  },
  {
    state_code: "AK",
    name: "Lisa Murkowski"
  },
  {
    state_code: "WY",
    name: "Michael Enzi"
  },
  {
    state_code: "WY",
    name: "John Barrasso"
  }
];

$(document).ready(function(){
  console.log(loadData());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
0 голосов
/ 03 декабря 2018

Вы ищете что-то подобное?

senatorDataNew = {};    
senatorData.forEach(senator => {
    if (! senatorDataNew[senator.state_code]) {
        senatorDataNew[senator.state_code] = {names: []};
    }

    senatorDataNew[senator.state_code].names.push(senator.name)
});
...