Я хочу сделать это равным:
const arr = [{id: 1}, {id: 2}, {id: 3}];
const item = arr.find(v => v.id===2);
if (item) {
console.log(item);
}
Есть ли сокращенное выражение, которое я могу сделать, где я могу оценить, был ли найден элемент, и использовать этот элемент внутри блока?
Что-то вроде:
if (const item = arr.find(v => v.id ===2) {
console.log(item);
}
Да, только простая настройка для вашего кода - изменение item
к let
объявленных вне если if
так, что он может быть переназначен в состоянии:
const arr = [{id: 1}, {id: 2}, {id: 3}];
// not actually necessary, but leaving it out will implicitly assign to global object:
let item;
if (item = arr.find(v => v.id ===2)) {
console.log(item);
}
Тем не менее, я бы не рекомендовал его - присвоение переменных внутри условного кода является запахом кода. Я предпочитаю вашу оригинальную версию, где .find
делается снаружи.
Вы могли бы также сделать свою собственную функцию для чего-то вроде этого, если хотите. Определение функции не является крошечным, но теперь вы сможете назвать это кратко:
function findAnd(arr, condition, callback) {
const item = arr.find(condition);
if (item) callback(item);
}
const arr = [{id: 1}, {id: 2}, {id: 3}];
findAnd(arr, v => v.id === 2, item => console.log(item));
Интересно... в то время как оригинал не очень длинный, было любопытно поддразнивать. Не очень коротко, но что-то.
for (let item = arr.find(v => v.id === 2);item;) {
console.log('Found', item);
break;
}
Если вам просто нужно использовать item
внутри блока if
, вам не нужны var
, let
или const
. Но недостатком является то, что переменная будет привязана по всему миру.
const arr = [{id: 1}, {id: 2}, {id: 3}];
if (item = arr.find(v => v.id === 2)) {
console.log(item);
}
let
дляconst
); они просто устроены по-другому. Разница здесь в том, что вы можете сохранитьlet item;
заявление, если оно может быть определено в другом месте. Это не очень большая экономия, но я думаю, что мы все цепляемся за соломинку здесь.