#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
функция может быть немного запутанной, если вы никогда не использовали ее раньше, особенно в сочетании с деструктурированием аргументов, однобуквенными именами переменных и троичным lol2. @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)