У меня есть массив объектов, которые выглядят так
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;
}
почему бы не передать поле, которое также необходимо сравнивать. например, в первом 1 идентификаторе. что-то вроде getValues(input, {id: ids}, "text") или getValues(input, ids, "id","text")
@cmgchess, не могли бы вы рассказать мне, как будет выглядеть эта реализация?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


константный массив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, как они могут применить его в своей конкретной ситуации.
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Вот две функции общего назначения, которые фильтруют список объектов для заданного ключевого атрибута, значение которого находится в предоставленном списке 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"));может преобразовать ключевые значения в набор раньше, если это необходимо, но я не знаю, имеет ли это большое значение
Обновлено, чтобы включить измененный вопрос и тестовый код.
@jarod, можем ли мы избежать лишнего аргумента и назвать его так, getValues(input, "id": [ids], "text") , где text - это поле, с которым оно будет сравниваться?
@lrr97, возможно, придется поступить так getValues(input, {"id": ids}, "text"). а в функции можно сделать что-то вроде const [field,values] = Object.entries(input2)[0] теперь у вас есть все что нужно
@cmgchess хорошая идея, добавил.
Ваша функция
getValues()не определена идеально. Предполагается, что если вызывающий объект прошел"text", то фильтр неявно находится на"id", и наоборот.