[英]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.split
和Array.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.