如何遍历 json 数据并合并具有相同状态 ID 的行?
How to loop over json data and merge rows with the same state id?
我有 .json us-senat 文件,每个州有两名参议员。我想遍历此 json 文件并创建新的 JS 对象,该对象应将状态 ID 作为键,然后为每个键 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
具有新值。我想知道这是否可行,实现该目标的最简单方法是什么?
您在找这样的东西吗?
senatorDataNew = {};
senatorData.forEach(senator => {
if (! senatorDataNew[senator.state_code]) {
senatorDataNew[senator.state_code] = {names: []};
}
senatorDataNew[senator.state_code].names.push(senator.name)
});
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);
如果只有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>
我有 .json us-senat 文件,每个州有两名参议员。我想遍历此 json 文件并创建新的 JS 对象,该对象应将状态 ID 作为键,然后为每个键 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
具有新值。我想知道这是否可行,实现该目标的最简单方法是什么?
您在找这样的东西吗?
senatorDataNew = {};
senatorData.forEach(senator => {
if (! senatorDataNew[senator.state_code]) {
senatorDataNew[senator.state_code] = {names: []};
}
senatorDataNew[senator.state_code].names.push(senator.name)
});
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);
如果只有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>