Javascript — получение соответствующего объекта между двумя массивами

#javascript

#javascript

Вопрос:

У меня есть следующие массивы:

Первый массив:

 const dummyJSON = [
    {
      id: 1,
      sponsor_date: '2020-08-16T22:45:03.154Z'
    },
    {
      id: 2,
      sponsor_date: '2020-09-16T22:45:03.154Z'
    },
    {
      id: 3,
      sponsor_date: '2020-09-01T22:45:03.154Z'
    }
  ]
  

Второй массив:

 const validated = [ true, false, false ]
  

И я хотел получить объект (dummyJSON.id ) когда соответствующий (проверенный) элемент массива имеет значение true.

В принципе, если первый элемент в массиве validate [0] имеет значение «true», то я хотел бы иметь соответствующее значение идентификатора элемента [0] в массиве dummyJSON.

Комментарии:

1. Вы ищете все объекты, которые имеют true проверенное значение? Каков желаемый результат (массив идентификаторов? один идентификатор?)

2. @CollinD Да! Мой желаемый результат — иметь массив идентификаторов.

3. @Taplar. Мне это просто нравится, ахахах. srry

Ответ №1:

Вы можете использовать Array#reduce для получения массива проверенных идентификаторов.

Он будет в основном перебирать каждый элемент, и если индекс текущего итерированного объекта соответствует истинному значению внутри validated с тем же индексом, объект id будет перенесен в результат.

 const dummyJSON = [
    { id: 1, sponsor_date: '2020-08-16T22:45:03.154Z' },
    { id: 2, sponsor_date: '2020-09-16T22:45:03.154Z' },
    { id: 3, sponsor_date: '2020-09-01T22:45:03.154Z' }
];

const validated = [true, false, false];

const validatedIds = dummyJSON
  .reduce((s, { id }, i) => (validated[i] ? s.push(id) : s, s), []);

console.log(validatedIds);  

Комментарии:

1. Отличное решение, возможно, стоит добавить немного объяснений, reduce функция может быть немного запутанной, если вы никогда не использовали ее раньше, особенно в сочетании с деструктурированием аргументов, однобуквенными именами переменных и троичным lol

2. @CollinD Спасибо, обновил ответ некоторыми подробностями.

Ответ №2:

Если ваша цель — просто получить проверенные элементы, используйте filter:

 const valid = dummyJSON.filter((item, index) => validated[index]);
  

Если вам просто нужны идентификаторы, добавьте вызов map:

 const valid = dummyJSON.filter((item, index) => validated[index]);
const ids = valid.map(x => x.id);
  

Это можно было бы сделать в одной строке, если вы предпочитаете, связав вызов map:

 const ids = dummyJSON.filter((item, index) => validated[index]).map(x => x.id);
  

 const dummyJSON = [
    { id: 1, sponsor_date: '2020-08-16T22:45:03.154Z' },
    { id: 2, sponsor_date: '2020-09-16T22:45:03.154Z' },
    { id: 3, sponsor_date: '2020-09-01T22:45:03.154Z' }
];

const validated = [ true, false, false ];

// source objects
console.log(dummyJSON.filter((_, index) => validated[index]));

// just the ids
console.log(dummyJSON.filter((_, index) => validated[index]).map(x => x.id));  

Комментарии:

1. Я полагаю, что запрашивающий хочет, чтобы возвращались только идентификаторы, а не целые объекты.

2. Отмечено. Обновлено, чтобы добавить вызов map для получения идентификаторов.

Ответ №3:

Нет необходимости в reduce, filter может сделать это так же хорошо и быстрее :

 const validated = [ true, false, false ]
const dummyJSON = [
    {
      id: 1,
      sponsor_date: '2020-08-16T22:45:03.154Z'
    },
    {
      id: 2,
      sponsor_date: '2020-09-16T22:45:03.154Z'
    },
    {
      id: 3,
      sponsor_date: '2020-09-01T22:45:03.154Z'
    }
  ]
// To get all validated objects from dummy JSON
const validatedJSON = dummyJSON.filter((obj, index) => validated[index])
// To extract just the ID's
const validatedJSONIds = validatedJSON.map(json => json.id)