Можете ли вы использовать оператор JavaScript «in» для проверки нескольких условий?

1

Я пытаюсь проверить, равна ли одна или несколько строк ключевому объекту. Например:

if(("apple" || "oranges) in fruitObj) {
    console.log(fruitObj);
}

Моя конечная цель - перебрать все строки в массиве и проверить, находится ли какая-либо из строк внутри "fruitObj".

  • 0
    @Teemu fruitObj не является массивом в этом вопросе. «Я пытаюсь проверить, равна ли одна или несколько строк ключу объекта ».
  • 1
    Важно понимать, что 'apple' || 'orange' сам по себе является выражением. Он оценивает первое значение, 'apple' , так как это правда. Этот вид логики || Выражение никогда не может использоваться для проверки нескольких значений в массиве или объекте.
Показать ещё 1 комментарий
Теги:
object
arrays

3 ответа

4
Лучший ответ

Это звучит, как вы хотите, чтобы массив some функций.

if (["apple", "oranges"].some(str => str in fruitObj)) {
   console.log(fruitObj);
}
  • 0
    Хороший ответ! Вы могли бы подумать, что будет более краткий способ осуществить это все же.
  • 0
    Здорово, спасибо, Дейв. Забыл про метод some ().
Показать ещё 2 комментария
1

Другой вариант: вы можете использовать Array.prototype.includes (представленный в ES7/ES2016):

if (Object.keys(fruitObj).some(key => ["apple", "oranges"].includes(key)) {
    console.log(fruitObj);
}

Это предполагает, что fruitObj не содержит никаких унаследованных свойств (поскольку они не будут возвращены Object.keys()).

После написания этого, я понял, что ответ Дэйва более краток и читабельен.

Для более старых браузеров имеется полиполк: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Polyfill

0

Строгий ответ на ваш вопрос: Нет, вы не можете использовать оператора in для тестирования "комбинированных" значений, но, конечно, вы можете "объединить" отдельные проверки:

var mycar = { make: 'Honda', model: 'Accord', year: 1998 };
if ('make' in mycar || 'model' in mycar)
  console.log("found it");
else
  console.log("not there");

Вы можете создать для него простую функцию и добавить ее в Object:

Object.prototype.contains = function(values) {
  if (values instanceof Array) {
    for (var i = 0; i < values.length; i++) {
      if (values[i] in this)
        return true;
    }
  } else if (values in this)
    return true;
  return false;
}

var mycar = { make: 'Honda', model: 'Accord', year: 1998 };
if (mycar.contains(['make', 'model']))
  console.log("found it");
else
  console.log("not there");

Обратите внимание: хотя функция contains также добавляется в массивы, вы не можете использовать ее для поиска строк в массиве строк. Оператор in только сравнивается с ключами объекта, а не его значениями. Ключами массива являются его индексы, поэтому вы можете делать только myArray.contains[0, 5] которые будут проверять, существует ли один из этих индексов в массиве.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню