Можно ли проверить, имеет ли массив все значения true, некоторые true и все false

#javascript #arrays #angular

#javascript #массивы #угловой

Вопрос:

У меня есть массив [true,true,true,false,false] , можно ли проверить, имеет ли массив все значения true или некоторые значения true или все значения false в одном цикле для повышения производительности. В настоящее время я использую every() and some() для каждого действия

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

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

1. s = new Set([true,true,true,false,false]) — если s.size равно двум, у вас есть микс, в противном a.has(true) случае он сообщит вам, все ли это true или все false

2. ^ игнорируйте опечатки… это s.has(true) , конечно

3. конечно, хотя вам нужно только .some для true и .some для false

Ответ №1:

Вы можете сделать

 const s = new Set(arr);
const mixed = s.size === 2;
const allTrue = !mixed amp;amp; s.has(true);
const allFalse = !mixed amp;amp; !allTrue;
 

тем не менее, более эффективный в моем простом тестировании, примерно в 8 раз (по крайней мере, в firefox), является

 const hasTrue = arr.some(v => v);
const hasFalse = arr.some(v => !v);
const mixed = hasTrue amp;amp; hasFalse;
const allTrue = !mixed amp;amp; hasTrue;
const allFalse = !mixed amp;amp; hasFalse;
 

Ответ №2:

Предполагая, что все в arr является логическим значением, вы могли бы сделать что-то вроде:

 const arr = [true, true, true, false, false];

const hasTrue = arr.includes(true);
const hasFalse = arr.includes(false);

const mixed = hasTrue amp;amp; hasFalse;
const allTrue = hasTrue amp;amp; !hasFalse;
const allFalse = !hasTrue amp;amp; hasFalse;
 

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

1. @Bravo Я подозреваю, что это не true так — он все равно будет сканировать массив, пока не найдет true значение, что может потребовать сканирования всего массива.

2. удивительно… arr.includes медленнее, чем array.some (по крайней мере, в firefox)

Ответ №3:

Обратите внимание, что это решение не особенно эффективно в JS, и ответ @Bravo — лучший выбор.

Вы могли бы использовать Math.min и Math.max в массиве; если результат отличается, у вас есть оба, если результат тот же, то в зависимости от того, равен ли результат 0 или 1, они все false или все true соответственно. Например,

 const arr = [true, false, false]

const min = Math.min(...arr), max = Math.max(...arr);

const mix = min != max;
const alltrue = !mix amp;amp; !!min;
const allfalse = !mix amp;amp; !min;

console.log(mix, alltrue, allfalse); 

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

1. это работает …. пока ваш массив не будет иметь длину> 500000 (в firefox): p

2. Ну, в этом случае они всегда могут использовать ваше решение! 🙂 просто из любопытства вы сравнивали это решение, когда проводили тестирование производительности?

3. Нет, я этого не делал — ты хотел, чтобы я: p

4. использование Math.max / min на порядок медленнее, чем использование some/includes (длиной 500000) — даже медленнее, чем использование метода Set

5. @Bravo Я много работаю в двоичном формате… но в 10 раз медленнее — это плохо. Я добавлю заметку (и поддержу вас), чтобы направить людей к вашему ответу.