#javascript #arrays #reactjs #object #array-filter
#javascript #массивы #reactjs #объект #массив-фильтр
Вопрос:
У меня есть массив, который содержит список разных объектов, и я хочу иметь возможность повторно использовать одну и ту же функцию для фильтрации разных объектов и значений в одном и том же массиве.
Мой массив
cocktailList = [
Object {
"abv": "24",
"alcoholic": "true",
"strength": "medium",
"type": Object {
"key": 3,
"label": "Medium",
"value": "medium",
...,
...,
},
},
Object {
...
},
]
и я вызываю функцию для фильтрации массива, передавая 2 параметра:
- поле, по которому я хочу фильтровать
- значение, которое он должен отфильтровать
Это моя функция и вызывающий объект
const drinkTypeHandler = (field, value) => {
const selectedType = cocktailList.filter((cocktail) => cocktail.field === value);
console.log(selectedType);
}
onPress={() => drinkTypeHandler(item.field, item.value)}
Функция отлично подбирает параметр «значение», но не использует параметр «поле», который я передаю.
Я попытался передать его как динамический параметр следующим образом, но все равно безуспешно
cocktailList.filter((cocktail) => `cocktail.${field} === ${value}`)
Если я жестко закодирую значение поля, оно сработает
i.e.
cocktailList.filter((cocktail) => cocktail.type.value === value)
Ответ №1:
Чтобы использовать динамическое имя поля, вы должны использовать квадратные скобки. Итак, вы бы использовали:
cocktailList.filter((cocktail) => cocktail[field] === value)
Проблема, с которой вы столкнетесь, — это вложенные пары ключ / значение type
, поскольку вы не можете использовать что-то подобное type.value
с этой нотацией.
Комментарии:
1. спасибо @veddermatic — Есть ли какое-либо решение для доступа к вложенным парам ключ / значение?
2. Не простой однострочный. Вам нужно будет посмотреть, была ли функция вызвана с
"type"
field
параметром, а затем вернутьvalue
туда свойство или использовать второй параметр для вложенного поиска:cocktail[field][subfield]
3. Это отлично, мне удалось легко найти решение, следуя вашему объяснению. Я разделяю параметр как [поле] [подполе] и добавляю проверку. В зависимости от значения флага я могу использовать коктейль [поле] или коктейль [поле] [подполе]. Большое спасибо
4. Потрясающе! Рад, что вы это поняли.
Ответ №2:
Вы можете сделать это с помощью cocktail[field]
:
const drinkTypeHandler = (field, value) => {
const selectedType = cocktailList.filter((cocktail) => cocktail[field] === value);
console.log(selectedType);
}
Ответ №3:
Чтобы получить доступ к свойству объекта с помощью переменной, вам необходимо использовать точечную нотацию
const drinkTypeHandler = (field, value) => {
const selectedType = cocktailList.filter((cocktail) => cocktail[field] === value);
console.log(selectedType);
}
Вы можете прочитать больше о скобках и точечных обозначениях здесь