如何将节点js中的格式数组从1个字符串更改为另一个对象
How to change format array in node js from 1 string become another object
我有一个这样的 json :
{
"status": 1,
"message": "ok",
"data": [
{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
}
]
}
我希望结果是这样的:
{ "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27" }, { "tenor": "29" }, { "tenor": "33" }, { "tenor": "35" } ] }
我尝试过的:
var arrayCoba = [];
var array1 = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
for(var i = 0; i<array1.data.length; i++){
var string = array1.data[i].tenor;
var substring = ",";
if(string.includes(substring) == true){
var tenor = array.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({ tenor }));
arrayCoba.push(dataTenor);
}
}
var dataHasil = array1.data.concat(arrayCoba);
return res.json({status:1,message:'ok',data:dataHasil});
但我得到的结果是:
{
"status": 1,
"message": "ok",
"data": [
{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
},
[
{
"tenor": "27"
},
{
"tenor": "29"
}
],
[
{
"tenor": "33"
},
{
"tenor": "35"
}
]
]
}
谁能帮帮我?谢谢..
将结果放入 JSON.stringify 函数后,您从 mongodb 得到结果,而不是像这样得到结果 "{"name":5,"value":6}"
var dataTenor = tenorArr.map(tenor => ({ tenor }));
return 男高音对象数组。
arrayCoba.push(dataTenor);
将数组添加到另一个数组中,为此你得到一个数组中的数组。
使用 spread operator -> arrayCoba.push(...dataTenor);
for (var i = 0; i < array1.data.length; i++) {
var string = array1.data[i].tenor;
var substring = ",";
if (string.includes(substring) == true) {
var tenor = array1.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({
tenor
}));
arrayCoba.push(...dataTenor);
} else {
arrayCoba.push(array1.data[i]);
}
}
var dataHasil = arrayCoba;
UPDATE:使用 map 运算符的另一种方式。
var substring = ',';
var copyDataTenors = array1.data;
var arrayCoba = "".concat(copyDataTenors
.map(obj => obj.tenor))
.split(substring)
.map(tenorString => ({
'tenor': tenorString
}))
var dataHasil = arrayCoba;
更新:使用递归和比以前的解决方案更通用
const data = [{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
}
]
/**
*
* @param {*} fn function callback
* @param {*} v string[] or string
* @param {*} attr string
* @param {*} substring string
*/
const processDeepObject = (fn, v, attr, substring) => {
return typeof v === 'string' ? {
[attr]: v
} : v[attr] ? fn(v[attr].split(substring), attr, substring) : [];
}
/**
* Version 1
* @param {*} arr Array of objects
* @param {*} attr target you want keep (for this use case tenor)
* @param {*} substring which char to split the data (for this use case ',')
*/
const deepObjectFlatten = (arr, attr, substring) => [].concat(...arr.map((v) => processDeepObject(deepObjectFlatten, v, attr, substring)));
/**
* Version 2 same as version 1 but compact
* @param {*} arr Array of objects
* @param {*} attr target you want keep (for this use case tenor)
* @param {*} substring which char to split the data (for this use case ',')
*/
const deepObjectFlattenV2 = (arr, attr, substring) => [].concat(...arr.map((v) => {
return typeof v === 'string' ? {
[attr]: v
} : v[attr] ? deepObjectFlattenV2(v[attr].split(substring), attr, substring) : [];
}));
console.log(deepObjectFlatten(data, 'tenor', ','))
console.log(deepObjectFlattenV2(data, 'tenor', ','))
/*
Output :
//v1
[ { tenor: '23' },
{ tenor: '17' },
{ tenor: '37' },
{ tenor: '27' },
{ tenor: '29' },
{ tenor: '33' },
{ tenor: '35' } ]
//v2
[ { tenor: '23' },
{ tenor: '17' },
{ tenor: '37' },
{ tenor: '27' },
{ tenor: '29' },
{ tenor: '33' },
{ tenor: '35' } ]
*/
您可以像下面这样操作:
function test() {
let obj = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
let res = [];
obj.data
.map(item => item.tenor.split(','))
.forEach(tenors => {
tenors.forEach(tenor => res.push({tenor}));
});
obj.data = res;
return obj;
}
调用上述方法后 returns:
{"status":1,"message":"ok","data":[{"tenor":"23"},{"tenor":"17"},{"tenor":"37"},{"tenor":"27"},{"tenor":"29"},{"tenor":"33"},{"tenor":"35"}]}
您错误地使用了地图返回的结果,您可以使用 John 提到的展开运算符来解决此问题。
你可以这样做:
var arrayCoba = [];
var array1 = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
for(var i = 0; i<array1.data.length; i++){
var string = array1.data[i].tenor;
var substring = ",";
if(string.includes(substring) == true){
var tenor = array1.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({ "tenor" : tenor }));
arrayCoba.push(...dataTenor);
} else {
arrayCoba.push({"tenor": array1.data[i].tenor})
}
}
return res.json({status:1,message:'ok',data : arrayCoba});
John,dacost 几乎使用了相同的逻辑,之前没有看到,所以发布了这个。
我有一个这样的 json :
{
"status": 1,
"message": "ok",
"data": [
{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
}
]
}
我希望结果是这样的:
{ "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27" }, { "tenor": "29" }, { "tenor": "33" }, { "tenor": "35" } ] }
我尝试过的:
var arrayCoba = [];
var array1 = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
for(var i = 0; i<array1.data.length; i++){
var string = array1.data[i].tenor;
var substring = ",";
if(string.includes(substring) == true){
var tenor = array.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({ tenor }));
arrayCoba.push(dataTenor);
}
}
var dataHasil = array1.data.concat(arrayCoba);
return res.json({status:1,message:'ok',data:dataHasil});
但我得到的结果是:
{
"status": 1,
"message": "ok",
"data": [
{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
},
[
{
"tenor": "27"
},
{
"tenor": "29"
}
],
[
{
"tenor": "33"
},
{
"tenor": "35"
}
]
]
}
谁能帮帮我?谢谢..
将结果放入 JSON.stringify 函数后,您从 mongodb 得到结果,而不是像这样得到结果 "{"name":5,"value":6}"
var dataTenor = tenorArr.map(tenor => ({ tenor }));
return 男高音对象数组。
arrayCoba.push(dataTenor);
将数组添加到另一个数组中,为此你得到一个数组中的数组。
使用 spread operator -> arrayCoba.push(...dataTenor);
for (var i = 0; i < array1.data.length; i++) {
var string = array1.data[i].tenor;
var substring = ",";
if (string.includes(substring) == true) {
var tenor = array1.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({
tenor
}));
arrayCoba.push(...dataTenor);
} else {
arrayCoba.push(array1.data[i]);
}
}
var dataHasil = arrayCoba;
UPDATE:使用 map 运算符的另一种方式。
var substring = ',';
var copyDataTenors = array1.data;
var arrayCoba = "".concat(copyDataTenors
.map(obj => obj.tenor))
.split(substring)
.map(tenorString => ({
'tenor': tenorString
}))
var dataHasil = arrayCoba;
更新:使用递归和比以前的解决方案更通用
const data = [{
"tenor": "23"
},
{
"tenor": "17"
},
{
"tenor": "37"
},
{
"tenor": "27,29"
},
{
"tenor": "33,35"
}
]
/**
*
* @param {*} fn function callback
* @param {*} v string[] or string
* @param {*} attr string
* @param {*} substring string
*/
const processDeepObject = (fn, v, attr, substring) => {
return typeof v === 'string' ? {
[attr]: v
} : v[attr] ? fn(v[attr].split(substring), attr, substring) : [];
}
/**
* Version 1
* @param {*} arr Array of objects
* @param {*} attr target you want keep (for this use case tenor)
* @param {*} substring which char to split the data (for this use case ',')
*/
const deepObjectFlatten = (arr, attr, substring) => [].concat(...arr.map((v) => processDeepObject(deepObjectFlatten, v, attr, substring)));
/**
* Version 2 same as version 1 but compact
* @param {*} arr Array of objects
* @param {*} attr target you want keep (for this use case tenor)
* @param {*} substring which char to split the data (for this use case ',')
*/
const deepObjectFlattenV2 = (arr, attr, substring) => [].concat(...arr.map((v) => {
return typeof v === 'string' ? {
[attr]: v
} : v[attr] ? deepObjectFlattenV2(v[attr].split(substring), attr, substring) : [];
}));
console.log(deepObjectFlatten(data, 'tenor', ','))
console.log(deepObjectFlattenV2(data, 'tenor', ','))
/*
Output :
//v1
[ { tenor: '23' },
{ tenor: '17' },
{ tenor: '37' },
{ tenor: '27' },
{ tenor: '29' },
{ tenor: '33' },
{ tenor: '35' } ]
//v2
[ { tenor: '23' },
{ tenor: '17' },
{ tenor: '37' },
{ tenor: '27' },
{ tenor: '29' },
{ tenor: '33' },
{ tenor: '35' } ]
*/
您可以像下面这样操作:
function test() {
let obj = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
let res = [];
obj.data
.map(item => item.tenor.split(','))
.forEach(tenors => {
tenors.forEach(tenor => res.push({tenor}));
});
obj.data = res;
return obj;
}
调用上述方法后 returns:
{"status":1,"message":"ok","data":[{"tenor":"23"},{"tenor":"17"},{"tenor":"37"},{"tenor":"27"},{"tenor":"29"},{"tenor":"33"},{"tenor":"35"}]}
您错误地使用了地图返回的结果,您可以使用 John 提到的展开运算符来解决此问题。
你可以这样做:
var arrayCoba = [];
var array1 = { "status": 1, "message": "ok", "data": [ { "tenor": "23" }, { "tenor": "17" }, { "tenor": "37" }, { "tenor": "27,29" }, { "tenor": "33,35" } ] }
for(var i = 0; i<array1.data.length; i++){
var string = array1.data[i].tenor;
var substring = ",";
if(string.includes(substring) == true){
var tenor = array1.data[i].tenor;
var tenorArr = tenor.split(',');
var dataTenor = tenorArr.map(tenor => ({ "tenor" : tenor }));
arrayCoba.push(...dataTenor);
} else {
arrayCoba.push({"tenor": array1.data[i].tenor})
}
}
return res.json({status:1,message:'ok',data : arrayCoba});
John,dacost 几乎使用了相同的逻辑,之前没有看到,所以发布了这个。