Какой простой способ проверить несколько объектов в массиве? - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь найти эффективный способ проверить, содержит ли массив ожидаемые объекты. В приведенном ниже примере я ожидаю, что в fruit будут объекты с type = apple, banana, and orange. Например, если banana отсутствует, то должно возвращаться false.

Вот очень простое решение:

const fruit = [
  {'type': 'apple', 'color': 'red', 'quantity': 10},
  {'type': 'banana', 'color': 'yellow', 'quantity': 9},
  {'type': 'orange', 'color': 'orange', 'quantity': 3}
  ];

let fruitsToCheck = ['apple', 'banana', 'orange'];
let fruitsThatExist = [];

fruit.forEach( fruit => {
  fruitsThatExist.push(fruit.type);
});

fruitsToCheck = fruitsToCheck.sort().toString();
fruitsThatExist = fruitsThatExist.sort().toString();

const allExist = fruitsToCheck === fruitsThatExist;

Решение, которое у меня работает но это не эффективно. Как лучше подойти к этой проблеме?

Ответы [ 5 ]

0 голосов
/ 17 марта 2020

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

const fruit = [
  {'type': 'apple', 'color': 'red', 'quantity': 10},
  {'type': 'banana', 'color': 'yellow', 'quantity': 9},
  {'type': 'orange', 'color': 'orange', 'quantity': 3}
  ];
  
const fruitsToCheck = ['apple', 'banana', 'orange'];

const allExist = fruit.every(({type})=> fruitsToCheck.includes(type))

console.log(allExist);
0 голосов
/ 17 марта 2020

Метод every проверяет, все ли элементы массива проходят тест, реализованный предоставленной функцией. Возвращает логическое значение. do c

Метод some проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией. Возвращает логическое значение. до c

const fruit = [
  {'type': 'apple', 'color': 'red', 'quantity': 10},
  {'type': 'banana', 'color': 'yellow', 'quantity': 9},
  {'type': 'orange', 'color': 'orange', 'quantity': 3}
];

let fruitsToCheck = ['apple', 'banana', 'orange'];

// solution - 1 
const allExist = fruitsToCheck.every(t => fruit.some(f => f.type === t));

// soution - 2
const allExist = fruitsToCheck.every(f => fruit.map(fr => fr.type).includes(f))

// soution - 3 
const allExist = [...new Set(fruit.map(f => f.type))].length === fruitsToCheck.length;



0 голосов
/ 17 марта 2020

const fruits = [
  {'type': 'apple', 'color': 'red', 'quantity': 10},
  {'type': 'banana', 'color': 'yellow', 'quantity': 9},
  {'type': 'orange', 'color': 'orange', 'quantity': 3}
  ];
  
 console.log(fruits.find(fruit => fruit.type === 'apple' || fruit.type === 'banana' || fruit.type === 'orange') !== undefined)

, если вам нужно проверить, все ли фрукты, яблоки, бананы и апельсины присутствуют

const fruits = [
      {'type': 'apple', 'color': 'red', 'quantity': 10},
      {'type': 'banana', 'color': 'yellow', 'quantity': 9},
      {'type': 'orange', 'color': 'orange', 'quantity': 3}
      ];
      
const map = {
  'apple': 0,
  'banana': 0,
  'orange': 0
}
     
console.log(fruits.reduce((sum, fruit) => sum + (map[fruit.type] === 0 ? ++map[fruit.type] : 0), 0) === 3)
0 голосов
/ 17 марта 2020

Вы можете собрать типы в Set и проверить с помощью Set#has в качестве обратного вызова для Array#every.

const
    fruit = [{ type: 'apple', color: 'red', quantity: 10 }, { type: 'banana', color: 'yellow', quantity: 9 }, { type: 'orange', color: 'orange', quantity: 3 }],
    fruitsToCheck = ['apple', 'banana', 'orange'],
    allExist = fruitsToCheck.every(
        Set.prototype.has,                     // callback
        new Set(fruit.map(({ type }) => type)) // thisArg
    );

console.log(allExist);
0 голосов
/ 17 марта 2020

Проверить array.every и array.some :

const allExist = fruitsToCheck.every(type =>
  fruit.some(fruit => fruit.type === type)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...