Создать массив на основе двух массивов

1

У меня есть две details и options массива options которые поступают из разных источников (запросы веб-ави)

details: [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]


 options: {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ],
    }

Я хочу объединить эти буксирные массивы, как

combined: [
        groups: 
            {
                options:[ 
                    { id: 'g1' },
                    { id: 'g2' }
                ], 
                details: { option: true}
            },
        category: 
                {
                 options:   [ 
                    { id: 'c1' },
                    { id: 'c2' }
                ], 
                details: { option: false}
            },
    ]

В принципе, если какой-либо id из details соответствует свойству options он должен войти в новый массив под тем же именем свойства, и все details кроме id относятся к свойству связанных details.

Каков наилучший способ сделать это? Может ли lodash справиться с этим?

  • 1
    Пожалуйста, добавьте то, что вы пробовали, чтобы мы могли помочь вам решить проблему, с которой вы столкнулись.
  • 2
    Я бы сказал, у вас есть только один массив.
Показать ещё 3 комментария
Теги:
arrays

3 ответа

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

Если вы хотите только элементы в обоих options и details (пересечение):

var details = [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]

var options = {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ]
    }

var combined = {};
details.forEach(({id: id, option: option}) => {
  if (options[id]) {
    combined[id] = combined[id] || {};
    combined[id].options = options[id];
    combined[id].details = {option: option};
  }
})

console.log(JSON.stringify(combined, null, "\t"))
/*
{
  "groups": {
    "options": [
      {
        "id": "g1"
      },
      {
        "id": "g2"
      }
    ],
    "details": {
      "option": true
    }
  },
  "category": {
    "options": [
      {
        "id": "c1"
      },
      {
        "id": "c2"
      }
    ],
    "details": {
      "option": false
    }
  }
}
*/

Если вы хотите сохранить все элементы из options и details ли они (union):

var details = [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]

var options = {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ]
    }

var combined = {};

Object.keys(options).forEach(id => {
  combined[id] = {};
  combined[id].options = options[id];
})
details.forEach(({id: id, option: option}) => {
  combined[id] = combined[id] || {};
  combined[id].details = {option: option};
})

console.log(JSON.stringify(combined, null, "\t"))
/*
{
  "groups": {
    "options": [
      {
        "id": "g1"
      },
      {
        "id": "g2"
      }
    ],
    "details": {
      "option": true
    }
  },
  "category": {
    "options": [
      {
        "id": "c1"
      },
      {
        "id": "c2"
      }
    ],
    "details": {
      "option": false
    }
  },
  "other": {
    "options": [
      {
        "id": "o1"
      },
      {
        "id": "o2"
      }
    ]
  }
}
*/
0

Здесь решение для вашей проблемы

var details= [
      { id: 'groups', option: true },
      { id: 'category', option: false }
];


var options= {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ],
    };
 
var combined = {};

for (var i= 0;i<details.length;i++){
var obj = {}
obj.options=options[details[i].id];
obj.details = {};
obj.details.option=details[i].option;
combined[details[i].id] = obj;

}

console.log(combined)
0

Для ввода значений деталей необходимо использовать [] нотацию.

options['groups']['details'] = true
options['groups']['category'] = false

Ещё вопросы

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