#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 или все false2. ^ игнорируйте опечатки… это
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 раз медленнее — это плохо. Я добавлю заметку (и поддержу вас), чтобы направить людей к вашему ответу.