0

我有 us-senat 的 .json 文件,每个州都有两个参议员。我想遍历这个 json 文件并创建新的 JS 对象,该对象应该将状态 id 作为键,然后为每个键设置两个属性,然后name1name2. 以下是数据在原始文件中的外观示例:

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新值。我想知道这是否可能,实现这一目标的最简单方法是什么?

4

3 回答 3

2

你在寻找这样的东西吗?

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

    senatorDataNew[senator.state_code].names.push(senator.name)
});
于 2018-12-03T18:53:28.367 回答
2

如果只有 2 个参议员,您可以根据累加器中是否已经存在键来使用reduce和设置键旁边的对象中的name1or属性: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>

于 2018-12-03T18:56:52.600 回答
1

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

于 2018-12-03T18:55:30.910 回答