Получить совпадающие элементы путем сравнения двух массивов

У меня есть массив объектов, которые выглядят так

const input = [ {id : "1" , text: "ABC", value: "abc" }, {id : "2" , text: "DEF", value: "def" },  {id : "3" , text: "LMN", value: "lmn" } ]

Приведенная выше функция-оболочка при передаче соответствующих входных данных должна возвращать следующее

const ids = ["1", "3"]
const values = ["def", "lmn"]
const texts = ["DEF", "LMN"]

getValues(input, ids, "text") // ["ABC", "LMN"]
getValues(input, values, "id") // ["2", "3"]
getValues(input, texts, "value") // ["def", "lmn"]

Когда передается группа ids и когда обязательное поле равно text, оно должно возвращать совпадающие значения text из входного массива. То же самое происходит, когда values и id передаются как обязательные поля, он должен возвращать все совпадающие ids из ввода.

Код, который я пробовал


function getValues(input1, input2, field){
  const result = input1.map(({id, text, value}) => {
     if (text === input2){
       return input1[field];
     }
  }); 
  return result;
}

Ваша функция getValues() не определена идеально. Предполагается, что если вызывающий объект прошел "text", то фильтр неявно находится на "id", и наоборот.

jarmod 18.04.2023 14:29

почему бы не передать поле, которое также необходимо сравнивать. например, в первом 1 идентификаторе. что-то вроде getValues(input, {id: ids}, "text") или getValues(input, ids, "id","text")

cmgchess 18.04.2023 14:35

@cmgchess, не могли бы вы рассказать мне, как будет выглядеть эта реализация?

user16860065 18.04.2023 14:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

константный массив1 = [1, 2, 3, 4, 5]; константный массив2 = [3, 4, 5, 6, 7];

const MatchingItems = array1.filter(item => array2.includes(item));

console.info(совпадающие элементы); // Вывод: [3, 4, 5]

Хотя этот код дает пример метода .filter(), он не показывает OP, как они могут применить его в своей конкретной ситуации.

Nick Parsons 18.04.2023 14:39
Ответ принят как подходящий

Вот две функции общего назначения, которые фильтруют список объектов для заданного ключевого атрибута, значение которого находится в предоставленном списке keyvalues, а затем возвращают выбранный attr для этих объектов.

Второй вариант сворачивает ключ и значение атрибута фильтра в объект, такой как {"id": ids}.

const input = [ {id : "1" , text: "ABC", value: "abc" }, {id : "2" , text: "DEF", value: "def" },  {id : "3" , text: "LMN", value: "lmn" } ]

const ids = ["1", "3"];
const values = ["def", "lmn"];
const texts = ["DEF", "LMN"];

function getValuesOld(objects, key, keyvalues, attr) {
  return objects.filter(x => keyvalues.includes(x[key])).map(x => x[attr]);
}

console.info(getValuesOld(input, "id", ids, "text"));
console.info(getValuesOld(input, "value", values, "id"));
console.info(getValuesOld(input, "text", texts, "value"));

function getValues(objects, key, attr) {
  const [keyname, keyvalues] = Object.entries(key)[0];
  return objects.filter(x => keyvalues.includes(x[keyname])).map(x => x[attr]);
}

console.info(getValues(input, { "id": ids }, "text"));
console.info(getValues(input, { "value": values }, "id"));
console.info(getValues(input, { "text": texts }, "value"));

может преобразовать ключевые значения в набор раньше, если это необходимо, но я не знаю, имеет ли это большое значение

cmgchess 18.04.2023 14:41

Обновлено, чтобы включить измененный вопрос и тестовый код.

jarmod 18.04.2023 14:47

@jarod, можем ли мы избежать лишнего аргумента и назвать его так, getValues(input, "id": [ids], "text") , где text - это поле, с которым оно будет сравниваться?

user16860065 18.04.2023 14:48

@lrr97, возможно, придется поступить так getValues(input, {"id": ids}, "text"). а в функции можно сделать что-то вроде const [field,values] = Object.entries(input2)[0] теперь у вас есть все что нужно

cmgchess 18.04.2023 14:53

@cmgchess хорошая идея, добавил.

jarmod 18.04.2023 14:58

Другие вопросы по теме