[英]Convert JSON to Array of Objects using lodash
我在这种格式的 NoSql 数据库中有一个 JSON 对象。 我们在从其他数据库迁移一些记录后获取这些数据,这些是多值字段。(基本上我们正在尝试清理数据以进行进一步处理)。
{
"BPContName":"aName;bName;cName",
"BPContEmail":"aEmail;bEmail;cEmail",
"BPContPWID":"aPWID;bPWID;cPWID"
}
我想在同一个 JSON 中添加另一个键“bpTableDataName”,它应该具有这种格式和值,
"bpTableDataName": [
{
"name": "aName",
"email": "aEmail",
"pwdid": "aPWID"
},
{
"name": "bName",
"email": "bEmail",
"pwdid": "bPWID"
},
{
"name": "cName",
"email": "cEmail",
"pwdid": "cPWID"
}
],
有没有办法使用 lodash 来实现这一点?
尝试以下代码 -
o = { "BPContName": "aName;bName;cName", "BPContEmail": "aEmail;bEmail;cEmail", "BPContPWID": "aPWID;bPWID;cPWID" } map = { "BPContName" : "name", "BPContEmail": "email", "BPContPWID": "pwdid" } const result = _.reduce(o, (arr, v, k) => ( v.split(";").forEach((x,i) => _.set(arr, `${i}.${map[k]}`, x)), arr ), []) console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
您可以使用split()
将值拆分为数组。 然后遍历数组并创建 require json,然后将其推送到结果中。
看一下这个。
var data = { "BPContName":"aName;bName;cName", "BPContEmail":"aEmail;bEmail;cEmail", "BPContPWID":"aPWID;bPWID;cPWID" } var names = data.BPContName.split(';'); var emails = data.BPContEmail.split(';'); var pwids = data.BPContPWID.split(';'); var results = []; for(var i = 0 ; i < names.length; i++) { var obj = { name: names[i], email: emails[i], pwdid: pwids[i] } results.push(obj); } console.log(results)
您可以像这样reduce
Object.entries
返回的条目:
let obj = { "BPContName": "aName;bName;cName", "BPContEmail": "aEmail;bEmail;cEmail", "BPContPWID": "aPWID;bPWID;cPWID" } let bpTableDataName = Object.entries(obj).reduce((r, [key, value]) => { let splits = value.split(";"); key = key.replace("BPCont", "").toLowerCase(); splits.forEach((split, i) => (r[i] = r[i] || {})[key] = split) return r; }, []) obj.bpTableDataName = bpTableDataName; console.log(obj)
Object.entries
返回一个键值对数组。 循环遍历它们中的每一个split
每个值;
BPCont
部分并使其lowerCase
splits
并更新每个索引处对象的特定键更新:
由于您在输出的键中有一个额外的d
,您可以创建一个映射对象:
propertyMap = {
"BPContName": "name",
"BPContEmail": "email",
"BPContPWID": "pwdid"
}
在reduce
,将replace
代码更改为:
key = propertyMap[key]
使用Object.assign
、 Object.entries
、 Array#map
和扩展运算符使这变得微不足道
const inputdata = { "BPContName":"aName;bName;cName", "BPContEmail":"aEmail;bEmail;cEmail", "BPContPWID":"aPWID;bPWID;cPWID" }; const t1=Object.assign({},...Object.entries(inputdata).map(([k,v])=>({[k]:v.split(';')}))); inputdata.bpTableDataName=t1.BPContName.map((name,i)=>({name,email:t1.BPContEmail[i],pwdid:t1.BPContPWID[i]})); console.log(inputdata);
当然,没有单线就不会是我
const obj = { "BPContName":"aName;bName;cName", "BPContEmail":"aEmail;bEmail;cEmail", "BPContPWID":"aPWID;bPWID;cPWID" }; // one line to rule them all obj.bpTableDataName=Object.entries(obj).reduce((r,[k,v])=>(v.split(';').forEach((v,i)=>(r[i]=r[i]||{})[{BPContName:'name',BPContEmail:'email',BPContPWID:'pwdid'}[k]]=v),r),[]); // console.log(obj);
你可以使用 lodash 的_.flow()
来创建一个函数。 使用_.map()
和_.overArgs()
创建一个函数来拆分值,格式化键,然后使用_.unzip()
将它们转换为对的数组,例如[['name', 'x'], ['name', 'y']]
。 使用_.unzip()
转置数组数组以组合不同的属性对。 然后使用_.map()
进行迭代,并且使用对每个阵列转换为对象_.fromPairs()
const { flow, partialRight: pr, map, unzip, overArgs, times, size, constant, split, fromPairs } = _ const keysMap = new Map([['BPContName', 'name'], ['BPContEmail', 'email'], ['BPContPWID', 'pwdid']]) const formatKey = key => keysMap.get(key) const splitVals = pr(split, ';') const fn = flow( pr(map, overArgs( (vals, k) => unzip([vals, times(size(vals), constant(k))]), [splitVals, formatKey]) ), unzip, // transpose pr(map, fromPairs) // convert each pairs array to object ) const data = { "BPContName":"aName;bName;cName", "BPContEmail":"aEmail;bEmail;cEmail", "BPContPWID":"aPWID;bPWID;cPWID" } const results = fn(data) console.log(results)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
基本上你需要的是zip
它。
片段:
let obj = {"BPContName":"aName;bName;cName","BPContEmail":"aEmail;bEmail;cEmail","BPContPWID":"aPWID;bPWID;cPWID"}, res = _.zipWith( ..._.map(obj, v => v.split(';')), (name, email, pwid) => ({name, email, pwid}) ); console.log(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
注意,我们必须这样放置参数的顺序,原始对象在使用Object.values
时给我们值或在使用Object.keys
时给我们键通常是按字母顺序排列的。 但是,如果在任何环境中都不能保证顺序,我们可以使用一系列键作为元数据对其进行排序。
否则,您可以显式传递参数,例如:
(obj.BPContName.split(';'), obj.BPContEmail.split(';'), obj.BPContPWID.split(';'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.