Как фильтровать только значения с типом Symbol в массиве?

#javascript #jestjs

#javascript #jestjs

Вопрос:

Я работаю над библиотекой arrow, где я создаю функцию, которая возвращает только элементы с типом Symbol .

Я использую filter функцию для массива :

 export const extractSymbol = array => {
    if (isArray(array)) {
        return array.filter(value => typeof value === "symbol")
    }
}
  

Но поскольку я создаю тесты перед реализацией, этот тест завершается неудачей :

   expect(extractSymbol([1, 2, 4, Symbol('vue'), Symbol('react')])).toStrictEqual([Symbol('vue'), Symbol('react')]);
   
  

Я ожидал true, но он возвращает :

  Expected: [Symbol(vue), Symbol(react)]
 Received: serializes to the same string
  

Ответ №1:

Два символа, созданные с одним и тем же параметром, не равны друг другу:

 console.log(
  Symbol('foo') === Symbol('foo')
);  

Чтобы тест работал правильно, определите символы вне expect , чтобы вы могли передавать одну и ту же ссылку на оба массива:

 const s1 = Symbol('vue');
const s2 = Symbol('react');
expect(extractSymbol([1, 2, 4, s1, s2])).toStrictEqual([s1, s2]);
  

Комментарии:

1. Тесты пройдены, но могу ли я узнать, в чем разница между созданием в массиве и вне массива, и что именно произошло?

2. С помощью [Symbol('vue')], [Symbol('vue')] вы вызвали Symbol дважды, поэтому символы разделены (не равны друг другу). Но с const s = Symbol('vue'); compare([s], [s]) вы вызвали Symbol только один раз, поэтому созданный символ равен самому себе.

3. Если посмотреть на это так, это немного похоже на objects: {} !== {} , но const obj = {}; obj === obj

Ответ №2:

Попробуйте это:

 let arr = [Symbol('foo'), 123];

let filtered = arr.filter(x => typeof(x) == 'symbol');
console.log(filtered);  

Комментарии:

1. К сожалению, тесты завершились неудачей, но в чем разница между typeof с () ними и без них?

2. typeof ‘example’ и typeof(‘пример’) являются допустимым синтаксисом

3. Но проблема не была связана с синтаксисом.

4. я имею в виду, что вы можете написать typeof со скобками или без них