Próbuję przeformatować moją listę obiektów, grupując pewną parę kluczy w javascript.

Format danych

[{
    "sccode": "sccode1",
    "val": "1ADA"
}, {
    "sccode": "sccode2",
    "val": "1ADB"
}, {
    "sccode": "sccode1",
    "val": "1ADC"
}]

Spodziewany wynik

[{
        "scCode": "sccode1",
        "valCodes": ["1ADA", "1ADC"]
    }, 
{
        "scCode": "sccode2",
        "valCodes": ["1ADB"]
    }

]

Uważam, że mógłbym przejrzeć tablicę w pętli i dopasować klucze, ale czy istnieje szybki sposób na ponowne sformatowanie tego bez konieczności jawnej pętli? Próbowałem użyć funkcji zmniejszania poniżej, ale daje ona nieokreślone błędy podczas wyszukiwania, co moim zdaniem ma coś wspólnego z moim formatowaniem.

Wypróbowany (?) Kod

 const resp = data.reduce((acc, ele) => {
          const ant = acc.find(x => x.sccode === ele.sccode);
        }, []);
1
Jack N 31 marzec 2020, 22:29

4 odpowiedzi

Najlepsza odpowiedź

Czy to zrobił?

const src = [{"sccode":"sccode1","val":"1ADA"},{"sccode":"sccode2","val":"1ADB"},{"sccode":"sccode1","val":"1ADC"}],

    result = src.reduce((r,{sccode,val}) => {
      const match = r.find(({scCode}) => scCode == sccode)
      match ?
      match.valCodes.push(val) :
      r.push({scCode:sccode, valCodes: [val]})
      return r
    }, [])
    
console.log(result)
.as-console-wrapper{min-height:100%;}
2
Yevgen Gorbunkov 31 marzec 2020, 19:39

Spróbuj wykonać następujące czynności: używam mapy do przechowywania stanu częściowego, aby poprawić wydajność, zapobiegając przeszukiwaniu kodu w tablicy dla każdego początkowego obiektu.

let partial = [{
  "sccode": "sccode1",
  "val": "1ADA"
}, {
  "sccode": "sccode2",
  "val": "1ADB"
}, {
  "sccode": "sccode1",
  "val": "1ADC"
}].reduce((map, obj) => {
  if (!map[obj.sccode]) {
    map[obj.sccode] = [obj.val];
  } else {
    map[obj.sccode].push(obj.val);
  }
  return map;
}, {})

Object.keys(partial).map(sccode => ({
  sccode, valCodes: partial[sccode]
}));
1
TheGr8_Nik 31 marzec 2020, 20:55

Sprawdź ten kod:

    array.reduce(function(res, value){
        if(!res[value.sccode]) {
            res[value.sccode] = value; 
            res[value.sccode]['valCodes'] = []
            result.push(res[value.sccode]);
        }
        res[value.sccode]['valCodes'].push(value.val); 
        return res; 
    } ,{}); 

Testowałem tutaj i działa dobrze!

0
Leonardo Oliveira 31 marzec 2020, 19:41

Spróbuj loaddash / groupby

let groupByResult = groupBy(data, function (n) {
          return n.sccode
        });
0
Nonik 31 marzec 2020, 19:41