У меня есть массив объектов в качестве входных данных.

var val = [{matnr :'0001',type:'Z0001',price:12.3,location:'Afr'},{matnr :'0001',type:'Z0002',price:12.2,location:'US'},
,{matnr :'0002',type:'Z0003',price:11.2,location:'EU'}]

Мне нужно удалить местоположение из каждого объекта и группы по материалу.

val = [{
      matnr:0001
      types   :[{type:'Z001',price:12.3},{type:'Z001',price:12.2}]
     },
     {
      matnr:0002
      types   :[{type:'Z003',price:12.3}]
     }

Я пытался удалить объект из массива и сделал группу, но, кажется, не работает. Не могли бы вы помочь

    val.forEach((values)=> 
    Object.keys(values).forEach(function (item) {
         if (item !='matnr'||item !='type' || item != price){
           delete values[item];
         }; 
    }) 

    var grouped = _.groupBy(val, function(val) {
    return val.matnr;
  });
1
mani.gkn

2 ответа

Вы можете сделать это без использования lodash, просто используя функции высшего порядка

const cleaned = removeFromList(list).key('location')
const grouped = group(list).by('matnr')


function removeFromList(arr) {

  return {
    key: key => arr.map(item => {
      if (!item[key]) return item
      delete item[key]
      return item
    })
  }
}

function group(arr) {
  return {
    by: groupKey => {
      const groupsObj = arr.reduce((groups, item) => {
        const groupKeyValue = item[groupKey]
        if(!groupKeyValue) return groups

        if (!groups[groupKeyValue]){
          groups[groupKeyValue] = [item]
          return groups
        }

        groups[groupKeyValue] = [...groups[groupKeyValue], item]

        return groups
      }, {});

      return groupsObj
    }
  }
}

Примечание. Мы предпочитаем объектные структуры для производительности и легкого доступа как разработчики, поэтому в функции group by мы возвращаем сгруппированный объект со значениями материалов в качестве ключей и совпадениями в качестве их значений. Подобно :

{
  0001 : [{type:'Z001',price:12.3},{type:'Z001',price:12.2}]
  0002 : [{type:'Z003',price:12.3}]
}

пример доступен здесь на

Вы можете использовать .reduce () с деструктуризацией удалить свойство location и атрибуты группы с помощью matnr , создав объект, где каждый ключ равен matnr , а каждое значение является накоплением. свойств для данного заданного matnr примерно так:

const arr = [{matnr:"0001",type:"Z0001",price:12.3,location:"Afr"},{matnr:"0001",type:"Z0002",price:12.2,location:"US"},{matnr:"0002",type:"Z0003",price:11.2,location:"EU"}];

const res = Object.values(arr.reduce((acc, {matnr, type, price}) => {
  const {types = []} = acc[matnr] || {}; 
  acc[matnr] = {matnr, types: [...types, {type, price}]};
  return acc;
}, Object.create(null)));
console.log(res);
.as-console-wrapper {max-height: 100% !important;}
58578980