Задать вопрос
@Now159

Как собрать массив id на основе двух массивов?

Добрый вечер, подскажите как мне забрать в массив 3 все id объектов из массива 1, если значения массива 2 совпадают с title объектов массива 1
array: [
 {id: 1, title: "значение 1"},
 {id: 2, title: "значение 2"},
 {id: 3, title: "значение 3"},
 {id: 4, title: "значение 4"},
 {id: 5, title: "значение 5"},
 {id: 6, title: "значение 6"}
 ],
  
array2: [значение 1, значение 2, значение 3]


array3
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F Куратор тега JavaScript
В каком порядке должны располагаться значения в результирующем массиве - так же, как в первом из исходных массивов, или как во втором?

Может ли быть так, что какие-то из значений второго массива отсутствуют в первом? Если да - добавлять в результирующий массив какое-то дефолтное значение, или ничего не делать?

Могут ли значения во втором массиве повторяться? Если да - сколько раз надо добавлять соответствующие им id в результирующий массив - один или согласно количеству повторений?

Могут ли значений title в первом массиве быть неуникальны? Если да, какие из соответствующих им id помещать в результирующий массив - первые, последние или все, что есть?

В общем, вариантов тут масса, выбирайте:

computed: {
  ids() {
    return this.strings.map(n => this.objects.find(m => m.title === n)?.id);
  },

  // или

  ids() {
    const ids = this.objects.reduce((acc, n) => (acc[n.title] = n.id, acc), {});
    return this.strings.map(n => ids[n] ?? 'Получить id не удалось - объекта с указанным title нет');
  },

  // или

  idByTitle() {
    return Object.fromEntries(this.objects.map(n => [ n.title, n.id ]));
  },
  ids() {
    const ids = this.idByTitle;
    return this.strings.reduce((acc, n) => (
      Object.hasOwn(ids, n) && acc.push(ids[n]),
      acc
    ), []);
  },

  // или

  stringsSet() {
    return new Set(this.strings);
  },
  ids() {
    return this.objects.reduce((acc, n) => (
      this.stringsSet.has(n.title) && acc.push(n.id),
      acc
    ), []);
  },

  // или

  idsByTitle() {
    return this.objects.reduce((acc, n) => (
      (acc[n.title] ??= []).push(n.id),
      acc
    ), []);
  },
  ids() {
    return this.strings.flatMap(n => this.idsByTitle[n] ?? []);
  },
},

UPD. Вынесено из комментариев:

computed, к сожалению не подходит

Подходит. Так во vue принято оформлять данные, зависящие от других данных. Что спросили - на то и ответил.

Если вдруг у вас там vuex или pinia, то вместо computed надо поместить показанный код в getters, и в случае vuex также заменить this на обращение к параметрам - первый для стейта, второй для геттеров.

Если ещё что-то - ну сделайте обычную функцию, которая будет принимать ваши массивы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы