Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自合并对象-lodash_Javascript_List_Object_Lodash - Fatal编程技术网

Javascript 自合并对象-lodash

Javascript 自合并对象-lodash,javascript,list,object,lodash,Javascript,List,Object,Lodash,我有一个目标: obj1 = [{ "accId": 23, "sName" : "qw" }, { "accId": 23, "sName": "as" }, { "accId":24, "sName": "we" } ] 我想使用lodash将此对象列表自合并为: re

我有一个目标:

obj1 = [{
           "accId": 23,
           "sName" : "qw" 
        }, 
        { 
           "accId": 23,
           "sName": "as" 
        },
        {
           "accId":24,
           "sName": "we"
        }
] 

我想使用lodash将此对象列表自合并为:

result = [{
             "accId": 23,
             "sName" : ["qw","as"]

          },
          {
           "accId":24,
           "sName": ["we"]
          }
]
我尝试使用纯javascript和for循环,但它似乎效率很低。我也尝试了一些lodash函数,但没有找到一个完美的匹配。 我还考虑过将对象列表拆分为单独的列表,每个列表中有一个对象,然后使用u.merge进行合并。但是我不知道是否有办法分割对象列表。

Lodash允许您指定一个迭代对象,该迭代对象被传递给数组的每个成员。结果数组相对于该迭代对象的返回值是唯一的

让数组=[{ 账号:23, sName:qw }, { 账号:23, 斯奈姆:就像 }, { 账号:24, 斯奈姆:我们 } ] 让uniqArray=\ uqbyarray,o=>o.accId; console.loguniqArray; Lodash允许您指定一个iteratee,该iteratee被传递给数组的每个成员。结果数组相对于该迭代对象的返回值是唯一的

让数组=[{ 账号:23, sName:qw }, { 账号:23, 斯奈姆:就像 }, { 账号:24, 斯奈姆:我们 } ] 让uniqArray=\ uqbyarray,o=>o.accId; console.loguniqArray;
您可以使用如下自定义reduce函数:

function merge (data) {
  const values = data.reduce((acum, item) => {
    const key = item.accId
    let cached = acum[key]

    if (cached) {
      cached.sName.push(item.sName)
    } else {
      cached = {
        "accId": key,
        "sName": [item.sName]
      }
    }

    return { ...acum, [key]: cached }
  }, {})

  return Object.values(values)
}

此函数将解决您的问题。

您可以使用如下自定义reduce函数:

function merge (data) {
  const values = data.reduce((acum, item) => {
    const key = item.accId
    let cached = acum[key]

    if (cached) {
      cached.sName.push(item.sName)
    } else {
      cached = {
        "accId": key,
        "sName": [item.sName]
      }
    }

    return { ...acum, [key]: cached }
  }, {})

  return Object.values(values)
}
此函数将解决您的问题。

使用lodash,您可以使用u.flow生成一个函数,该函数首先将具有相同accId的项目分组,然后映射每个组并生成一个新对象,其中包含该组收集的sName值:

const{flow,particle:pr,groupBy,map,head}=_ 常数fn=流量 prgroupBy,'accId', prmap,vs=>{…headvs,sName:mapvs,'sName'} 常量数组=[{accId:23,sName:qw},{accId:23,sName:as},{accId:24,sName:we}] const result=fn数组 console.logresult; 使用lodash,您可以使用u0.flow生成一个函数,该函数首先对具有相同accId的项目进行分组,然后映射每个组并生成一个新对象,其中包含该组收集的sName值:

const{flow,particle:pr,groupBy,map,head}=_ 常数fn=流量 prgroupBy,'accId', prmap,vs=>{…headvs,sName:mapvs,'sName'} 常量数组=[{accId:23,sName:qw},{accId:23,sName:as},{accId:24,sName:we}] const result=fn数组 console.logresult;
谢谢。但这并没有提供我想要的输出。谢谢:。但这并没有给我想要的输出。