繁体   English   中英

转换对象以根据现有键值添加新键

[英]Transform an object to add new keys based on existing key-values

我需要转换这个对象:

myObject  = {
"pageName": "home",
"dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c"}

对此:

myObject_mod = {
'pageName' : 'home',
'dataExtract' : {
    'data1'     : '',  //no value for 'data1'
    'data2'     : 'value2',
    'data3'     : 'value3',
    'data4' : {
        'data4key1'     :   'value4a',
        'data4key2'     :   'value4b',
        'data4key3'     :   'value4c'
    }
 }

我首先使用“ dataExtract”键,然后将其用“ |”分割,因此将其值分割了:

myObject.dataExtract.split("|");

(4) ["data1", "data2=value2", "data3=value3", "data4=value4a,value4b,value4c"]

我该如何继续?

结合使用Array.split()Array.reduce()和解构,将字符串分解为键和值,然后重新Array.split()为对象:

 const object = { "pageName": "home", "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c" } const result = { ...object, dataExtract: object.dataExtract.split('|') .reduce((r, kv) => { const [key, value = ''] = kv.split('=') r[key] = !value.includes(',') ? value : value.split(',').reduce((ra, val, i) => { ra[`${key}key${i + 1}`] = val; return ra; }, {}) return r }, {}) } console.log(result) 

使用reduce为数据提取中的每个条目建立结果对象。 一般形式为:

myArray.reduce((resultObject, entryString) => {
  // some logic here
  resultObject[key] = resultValue;
  return resultObject
}, {});

例如:

 array = { "pageName": "home", "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c" }; array_mod = { pageName: array.pageName, dataExtract: array.dataExtract.split("|").reduce((obj, entry) => { // handle cases like data1 if (entry.indexOf('=') === -1) { obj[entry] = ''; return obj; } // handle cases like data2 and data3 const [key, value] = entry.split('=', 2); if (value.indexOf(',') === -1) { obj[key] = value; return obj; } // handle cases like data4 const values = value.split(','); obj[key] = values.reduce((o, v, i) => (o[`${key}key${i+1}`] = v, o), {}); return obj; }, {}) }; console.log(array_mod); 

可以使用String.splitArray.reduce替代已发布的内容:

 const array = { "pageName": "home", "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c" }; const array_mod = { pageName: array.pageName, dataExtract: array.dataExtract.split('|').reduce((r, cur) => { const [k, v = ''] = cur.split('=', 2); const vs = v.split(','); r[k] = vs.length > 1 ? vs.reduce((sr, scur, i) => (sr[`${k}key${i + 1}`] = scur, sr), {}) : v; return r; }, {}) }; console.log(array_mod); 

带有注释和更明确的变量名:

 const array = { "pageName": "home", "dataExtract": "data1|data2=value2|data3=value3|data4=value4a,value4b,value4c" }; const array_mod = { pageName: array.pageName, // Split by | and build a key => value object from it dataExtract: array.dataExtract.split('|').reduce((data, entry) => { // Grab key (before `=`) and value (after `=`) const [key, value = ''] = entry.split('=', 2); // Grab subvalues (separated by `,`) if any const subValues = value.split(','); // If there are at least 2 subvalues, build a key => value object from them data[key] = subValues.length > 1 ? subValues.reduce((sub, subVal, i) => (sub[`${key}key${i + 1}`] = subVal, sub), {}) // Otherwise return the value as string : value; return data; }, {}) }; console.log(array_mod); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM