繁体   English   中英

使用 lodash 将 JSON 转换为对象数组

[英]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.assignObject.entriesArray#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.

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