使用 javascript 映射键值以创建具有嵌套对象的 json 结构
Map Key value to create a json structure with nested objects using javascript
我想从我将从查询结果中获取的平面数组创建一个数组对象,并想创建 json 结构作为响应以将其作为 api 响应传递。
例如-
平面阵列-
[{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}]
我想创建一个类似预期输出的结构
{
"United States": [
{
"ny": [
{
"user_id": "2311123",
"ssn": "7"
}
]
},
{
"abc": [
{
"user_id": "451313",
"ssn": "147"
},
{
"user_id": "65345",
"ssn": "444"
}
]
}
],
"Australia": [
{
"auus": [
{
"user_id": "763343",
"ssn": "678"
}
]
}
]
}
映射了 user_country 个对象数组和 user_city 个对象数组。
我试过这段代码,但无法达到预期的输出。:
const map = {};
results.forEach(arr => {
console.log("arr",arr)
if(map[arr.user_country]){
if(!map[arr.user_country].includes(arr.user_city))
map[arr.user_country].push(arr.user_city);
}else{
map[arr.user_country] = [arr.user_city]
}
});
console.log(map);
const results = [{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}
]
const out = {};
results.forEach(i => {
out[i.user_country] = out[i.user_country] || {};
out[i.user_country][i.user_city] = out[i.user_country][i.user_city] || [];
out[i.user_country][i.user_city].push({
user_id: i.user_id,
ssn: i.ssn
})
})
console.log(out)
这可能会产生预期的结果:
const array = [{ user_id: '2311123', user_country: 'United States', user_city: 'ny', ssn: 229 }, { user_id: '451313', user_country: 'United States', user_city: 'abc', ssn: 147 }, { user_id: '65345', user_country: 'United States', user_city: 'abc', ssn: 444 }, { user_id: '763343', user_country: 'Australia', user_city: 'auus', ssn: 678 }];
const map = array.reduce((map, {user_country, user_city, ...userInfo}) => {
if (!map[user_country]) {
map[user_country] = [{[user_city]: [{...userInfo}]}];
} else {
const ex = map[user_country].find(city => Object.keys(city)[0] === user_city);
if (!ex) {
map[user_country].push({[user_city]: [{...userInfo}]});
} else {
Object.values(ex)[0].push({...userInfo});
}
}
return map;
}, {});
console.log(map);
请检查该选项:
const results = [{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}];
const countries = {};
results.forEach(result => {
const {user_country, user_city, user_id, ssn} = result;
const cityList = countries[user_country] && countries[user_country][user_city] ? countries[user_country][user_city] : [];
const newCityList = [...cityList, {
user_id,
ssn
}];
countries[user_country] = {
...countries[user_country],
[user_city]: newCityList
};
});
console.log(countries);
请检查此解决方案:
const map = {};
results.forEach(arr => {
const { user_country, user_id, user_city, ssn } = arr;
if (!map[user_country]) {
map[user_country] = [];
}
if (map[user_country][user_city]) {
map[user_country][user_city].push({user_id, ssn});
} else {
map[user_country][user_city] = [{user_id, ssn}];
}
});
console.log(map)
我想从我将从查询结果中获取的平面数组创建一个数组对象,并想创建 json 结构作为响应以将其作为 api 响应传递。 例如- 平面阵列-
[{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}]
我想创建一个类似预期输出的结构
{
"United States": [
{
"ny": [
{
"user_id": "2311123",
"ssn": "7"
}
]
},
{
"abc": [
{
"user_id": "451313",
"ssn": "147"
},
{
"user_id": "65345",
"ssn": "444"
}
]
}
],
"Australia": [
{
"auus": [
{
"user_id": "763343",
"ssn": "678"
}
]
}
]
}
映射了 user_country 个对象数组和 user_city 个对象数组。 我试过这段代码,但无法达到预期的输出。:
const map = {};
results.forEach(arr => {
console.log("arr",arr)
if(map[arr.user_country]){
if(!map[arr.user_country].includes(arr.user_city))
map[arr.user_country].push(arr.user_city);
}else{
map[arr.user_country] = [arr.user_city]
}
});
console.log(map);
const results = [{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}
]
const out = {};
results.forEach(i => {
out[i.user_country] = out[i.user_country] || {};
out[i.user_country][i.user_city] = out[i.user_country][i.user_city] || [];
out[i.user_country][i.user_city].push({
user_id: i.user_id,
ssn: i.ssn
})
})
console.log(out)
这可能会产生预期的结果:
const array = [{ user_id: '2311123', user_country: 'United States', user_city: 'ny', ssn: 229 }, { user_id: '451313', user_country: 'United States', user_city: 'abc', ssn: 147 }, { user_id: '65345', user_country: 'United States', user_city: 'abc', ssn: 444 }, { user_id: '763343', user_country: 'Australia', user_city: 'auus', ssn: 678 }];
const map = array.reduce((map, {user_country, user_city, ...userInfo}) => {
if (!map[user_country]) {
map[user_country] = [{[user_city]: [{...userInfo}]}];
} else {
const ex = map[user_country].find(city => Object.keys(city)[0] === user_city);
if (!ex) {
map[user_country].push({[user_city]: [{...userInfo}]});
} else {
Object.values(ex)[0].push({...userInfo});
}
}
return map;
}, {});
console.log(map);
请检查该选项:
const results = [{
user_id: '2311123',
user_country: 'United States',
user_city: 'ny',
ssn: 229
},
{
user_id: '451313',
user_country: 'United States',
user_city: 'abc',
ssn: 147
},
{
user_id: '65345',
user_country: 'United States',
user_city: 'abc',
ssn: 444
},
{
user_id: '763343',
user_country: 'Australia',
user_city: 'auus',
ssn: 678
}];
const countries = {};
results.forEach(result => {
const {user_country, user_city, user_id, ssn} = result;
const cityList = countries[user_country] && countries[user_country][user_city] ? countries[user_country][user_city] : [];
const newCityList = [...cityList, {
user_id,
ssn
}];
countries[user_country] = {
...countries[user_country],
[user_city]: newCityList
};
});
console.log(countries);
请检查此解决方案:
const map = {};
results.forEach(arr => {
const { user_country, user_id, user_city, ssn } = arr;
if (!map[user_country]) {
map[user_country] = [];
}
if (map[user_country][user_city]) {
map[user_country][user_city].push({user_id, ssn});
} else {
map[user_country][user_city] = [{user_id, ssn}];
}
});
console.log(map)