如何使用lodash合并数组中的mutil对象?

时间:2019-02-11 09:43:52

标签: vue.js lodash

我的代码有一些问题:

[
 {
 "key": 0,
 "server": 0
 },
 {
 "key": 0,
 "server": 1
 },
 {
 "key": 1,
 "server": 0
 }
]

我如何得出结果:

[
 { key: 0 , server:[0,1] },
 { key: 1 , server:[0] }
]

我正在使用_.groupBy,但是它没有返回预期的结果。 如何用lodash合并数组中的mutil对象?

4 个答案:

答案 0 :(得分:1)

一种解决方案是结合使用groupBymapmergeWith

因此,首先,您按key对项目进行分组,因此在此示例中,它将返回一个对象,其中包含01作为将包含已分组项目的键。

然后,您使用.map遍历返回的对象并获得分组的值。

最后,您将.mergeWithcustomizer函数一起使用,该函数可用于自定义server键的值的合并方式。

const servers = [{
    "key": 0,
    "server": 0
  },
  {
    "key": 0,
    "server": 1
  },
  {
    "key": 1,
    "server": 0
  }
];

function customizer(objValue, srcValue, key, fourth) {
  if (key === 'server') {
    if (!_.isArray(objValue)) objValue = [objValue];
    return objValue.concat(srcValue);
  }
}

let test = _(servers)
  .groupBy('key')
  .map((values, key) => {
    if (values.length === 1) {
      values[0].server = [values[0].server];
      return values[0];
    }
    return _.mergeWith(...values, customizer);
  })
  .value();

console.log(test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

答案 1 :(得分:1)

new Vue({
  el: "#app",
  data: {
    needMergedArray: [
 {
    key: 0,
    server: 0
 },
  {
 key: 0,
 server: 1
 },
 {
 key: 1,
 server: 0
 }
],
  },
  methods: {
    mergeObject() {
        let merged = [];
      this.needMergedArray.map(item => {
        let found = false;
        merged.map(element => {
            if(item.key === element.key) {
            found = true;
            if(!element.server) {
              //const myserver = [item.server];
             element.server =[item.server];
                        } else {
              element.server.push(item.server);
                }
                }
            });
        if(!found) {
            const myserver = [item.server];
            merged.push({key: item.key, server: myserver});
        }
        found = false;
      });
        return merged;
    }
  }
})

答案 2 :(得分:1)

  

//一个循环解决方案:https://jsfiddle.net/haianhnc/2mhsquad/78

onPress={() => this.props.delete(i)}

答案 3 :(得分:0)

还没有测试

arr.reduce(function(acc,value){
    const isExists = acc.findIndex(({key})=>key===value.key)
    if(!isExists){
        acc.push(value)
    } else {
        let servers = acc[isExists].server
        if(!Array.isArray(servers))
            servers = [servers]
        servers.push(value.server)
        servers = _.uniq(servers)
        acc[isExists].server = servers
    }
    return acc
},[])