如何将节点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 几乎使用了相同的逻辑,之前没有看到,所以发布了这个。