Как объединить объект mutil в массиве с lodash? - PullRequest
0 голосов
/ 11 февраля 2019

У меня немного проблем с моим кодом:

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

, как я могу привести к:

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

Я использую _.groupBy, но он не возвращает результатыкак и ожидалось.Как объединить объект mutil в массиве с lodash?

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

// одноконтурное решение: https://jsfiddle.net/haianhnc/2mhsquad/78

mergeObject() { 
        let merged = {};
            this.needMergedArray.map(item => {
          merged = {...merged, [item.key]: {key: [item.key], server: (merged[item.key] && merged[item.key].server || []).concat(item.server)}};
        });
        return Object.values(merged);
      }
    }
0 голосов
/ 11 февраля 2019

Одним из решений было бы использование комбинации groupBy, map и mergeWith.

Таксначала вы группируете элементы по key, поэтому в этом примере он вернет объект с 0 и 1 в качестве ключей, которые будут содержать сгруппированные элементы.

Затем вы используете .mapчтобы выполнить итерацию по возвращенному объекту и получить сгруппированные значения.

Наконец, вы используете .mergeWith с функцией customizer, которую можно использовать для настройки способа объединения значений клавиши 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>
0 голосов
/ 11 февраля 2019
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;
    }
  }
})
0 голосов
/ 11 февраля 2019

Еще не тестировали

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
},[])
...