Не в состоянии преобразовать массив объектов в JavaScript

1

Я пытаюсь преобразовать этот массив объектов в другой формат:

let data = [
    { 
        Dimension_ID: 1,
        A1: 'N'
    }, {
        Dimension_ID: 2,
        A1: 'N'
    }, {
        Dimension_ID: 3,
        A1: 'N'
    }, {
        Dimension_ID: 917,
        A1: 'P'
    }, {
        Dimension_ID: 918,
        A1: 'P'
    }, {
        Dimension_ID: 919,
        A1: 'P'
    }, {
        Dimension_ID: 1,
        B1: 'Q'
    }, {
        Dimension_ID: 2,
        B1: 'Q'
    }, {
        Dimension_ID: 3,
        B1: 'Q'
    }
];

Я хочу создать новый объект следующим образом:

let params = [];

params['filterValues'] =  { A1: [ 'N', 'P' ],B1: [ 'Q' ] };

Вот код JavaScript, который я пытаюсь использовать.

  if(params.filterValues != undefined){
                    params.dimensionIds2 = [];
                        for (var key in params.filterValues) {
                            if(params.filterValues[key].length > 0)
                            params.filterValues[key].map((value)=>{
                                let filterData = data.filter(item => item[key] == value);
                                filterData.map((filterItem)=>{
                                    console.log(key,value,filterItem.Dimension_ID);
                                    //params.dimensionIds2[key][value].push(filterItem.Dimension_ID)   
                                })

                            })

                          }
                    }

Я могу указать значения console.log в цикле следующим образом:

  • A1 N 1
  • A1 N 2
  • A1 N 3
  • A1 P 917
  • A1 P 918
  • A1 P 919
  • B1 Q 1
  • B1 Q 2
  • B1 Q 3

Я хочу использовать эти данные:

данные ['A1'] ['N'] = [1,2,3]

данные ['A1'] ['P'] = [917,918,919]

данные ['B1'] ['Q'] = [1,2,3]

Я также попытался использовать этот код:

params.dimensionIds2[key][value].push(filterItem.Dimension_ID)
  • 0
    Обратите внимание, что data должны быть объектом, а не массивом. Массивы имеют только числовую индексацию
  • 0
    Также предоставьте некоторые примеры данных, чтобы сделать этот работоспособный минимальный воспроизводимый пример
Показать ещё 2 комментария
Теги:

2 ответа

0
Лучший ответ

Другой вложенный подход Array#reduce(). Обратите внимание, что вы хотите, чтобы params и результат были объектами, а не массивами, чтобы использовать строковые значения для ключей

let params = {};
let data = [{ Dimension_ID: 1,A1: 'N'},{ Dimension_ID: 2,A1: 'N'},{ Dimension_ID: 3,A1: 'N'},
{ Dimension_ID: 917,A1: 'P'},{ Dimension_ID: 918,A1: 'P'},{ Dimension_ID: 919,A1: 'P'},
{ Dimension_ID: 1,B1: 'Q'},{ Dimension_ID: 2,B1: 'Q'},{ Dimension_ID: 3,B1: 'Q'},];
params['filterValues'] =  { A1: [ 'N', 'P' ],B1: [ 'Q' ] };

let res = data.reduce((a, c) => {
  return Object.entries(params['filterValues']).reduce((a,[k, arr]) => {
    a[k] = a[k] || {}
    return arr.reduce((a,v) => {
      const o = a[k][v] = a[k][v] || [];
      c[k] && c[k] === v && o.push(c.Dimension_ID)
      return a
    },a);    
  },a);  
}, {});

console.log(res)
0

Вы можете попробовать это, чтобы организовать свои данные.

let data = [
    {Dimension_ID: 1, A1: 'N'},
    {Dimension_ID: 2, A1: 'N'},
    {Dimension_ID: 3, A1: 'N'},
    {Dimension_ID: 917, A1: 'P'},
    {Dimension_ID: 918, A1: 'P'},
    {Dimension_ID: 919, A1: 'P'},
    {Dimension_ID: 1, B1: 'Q'},
    {Dimension_ID: 2, B1: 'Q'},
    {Dimension_ID: 3, B1: 'Q'},];

const params = {A1: ['N', 'P'], B1: ['Q']};

const organize = (data, params) =>

    Object.keys(params).reduce((acc, val) => {

        acc[val] = params[val].reduce((a, v) => {
            
            a[v] = data
                      .filter((value) => value[val] === v)
                      .map(value => value.Dimension_ID);
            
            return a;
        }, {});

        return acc;
    }, {});

console.log(organize(data, params));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню