Найти индексы положительных элементов в массиве в JavaScript
Может кто-нибудь сказать мне, что не так? Я считаю, что моя функция карты правильная, но с findIndex() что-то не так. (Пожалуйста, не говорите мне код, поскольку речь идет о моем задании. Нужны только подсказки.)
4 ответа
function pos(arr) < var res = []; for (const [index, el] of arr.entries()) if (el >0) res.push(index) return res; >
function pos(arr) < return arr.map((ele, index) =>[ele, index]) .filter(([ele]) => ele > 0) .map(([_, origIndex]) => origIndex); >
function pos(arr) < return arr.map((ele, index) =>ele > 0 ? index : null) .filter(index => index !== null); >
Зачем вам map и filter делая несколько проходов через массивы, а не один проход с помощью reduce ? Если исходный массив содержит все положительные числа, вы посмотрите на каждое из них дважды.
@MarkMeyer Поскольку я не хочу сводить его к одному значению, я хочу сохранить массив. И есть четкое сопоставление один-к-одному или ни к чему, где map и filter превосходны. Решение reduce эквивалентно написанному мною циклу for … of (но он либо менее эффективен, либо дает ему «функциональное прикосновение», которого не должно быть).
@MarkMeyer Если вы спорите об одном проходе против нескольких проходов, вы можете изучить преобразователи, позволяющие объединить обратные вызовы в один проход, или реализовать (индексированный) эквивалент mapMaybe для JS.
Я предполагаю, что аргумент, что сокращение только для отдельных значений может иметь некоторый смысл, но я не вижу его в обычной практике — люди постоянно используют его для создания хеш-таблиц, объектов и других вещей, которые не являются отдельными значениями. Что касается эффективности — снижение, по-видимому, выигрывает, по крайней мере, в сафари и chrome: jsperf.com/map-filter-or-reduce через я подозреваю, что обычный цикл for а не for. of все равно победит.
@MarkMeyer Я считаю, что хеш-таблица (и другие композиты) также является отдельным объектом — моя точка зрения заключалась в том, что тип вывода по-прежнему является массивом, а также о размере входного массива.
Думаю, я просто буду доволен уважительным несогласием — если можно считать хеш-таблицу отдельной сущностью, можно считать массив индексов одной сущностью. Я ценю обсуждение — спасибо.
@MarkMeyer Да, мы можем считать это так. И, конечно, с помощью reduce он работает более гибко и универсально, чем map . Во многих функциональных языках map даже реализована с точки зрения reduce . Так почему же мы вообще используем map (или filter ), если мы всегда можем использовать reduce ? Поскольку это проще — нам не нужно указывать начальное значение [] , нам не нужно использовать push (или перечислить cons)!
@MarkMeyer При сокращении до хеш-таблицы у нас просто нет выбора — если бы была доступна функция прямого преобразования, мы бы ее использовали. Или на самом деле есть: вместо arr.reduce((m, x) => m.set(x.key, x.value), new Map) мы могли бы использовать более чистую new Map(arr.map(x => [x.key, x.value])) . То же самое здесь: это была filter_mapi функция в JS, все будут использовать его вместо того , чтобы reduce . В своем ответе я просто попытался реализовать это, используя filter + map отдельности.
Сначала вы можете сопоставить индекс, если значение положительное или -1 а затем фильтровать массив для существующих индексов.
Array#map возвращает новый массив с индексом элемента или -1 если элемент меньше нуля.
Array#filter возвращает все значения, которые не являются -1 . Короткое добавление только одного возвращает истинное значение, которое является возможным индексом.
function pos(array) < return array // [1, -4, 0, 5, 2] .map((v, i) =>v < 0 ? -1 : i) // [0, -1, 2, 3, 4] .filter(i =>i + 1); // [0, 2, 3, 4] > console.log(pos([1, -4, 0, 5, 2]));
Ваш обратный вызов для сопоставления
function pos(arr) < return arr.map(function (ele) < return arr.findIndex(ele =>ele > 0); >); > console.log(pos([1, -4, 0, 5, 2]));
не принимает элемент, потому что первая элемен- ele переменная никогда не будет использоваться позже. Затем вы всегда возвращаете индекс первого элемента arr , который равен 1 . Это значение больше как ноль, и обратный вызов для find возвращает true abd, набирает руки над фактическим индексом.
Если все числа в массиве положительные — вывести сообщение
Здравствуйте, помогите пожалуйста, есть массив чисел необходимо вывести сообщение если все числа положительные, но если хотя бы одно число отрицательно вывести другое сообщение. Заранее благодарю за помощь))
const numsArray = [2, -7, 5, 4, -8, -9, 10]; for( let i = 0; i numsArray.length; i++) { if (numsArray[i] > 0) { console.log('Array all elements are positive') } else { console.log('At least one element in array is negative') } }
Заменить в массиве все нечетные числа на 1. Если нечетных чисел нет, то вывести сообщение об этом
Добрый день! Помогите пожалуйста с программой на QBasic, Максимальный элемент осилил, нечетные.
Вывести информацию об ошибке, если в массиве все элементы положительные или нули
есть одномерный массив .немогу вывести информацию об ошибке,что в массиве все положительные члены.
Даны числа a, b, c. Если все они равны нулю, вывести об этом сообщение, если среди чисел нет нулей, найти и вывести их произведение, в противном случа
Всем привет. Будьте добры, подсобите в написании программки: "Даны числа a, b, c. Если все они.
Если в массиве больше отрицательных чисел, все положительные числа заменить суммой отрицательных
Задан одномерный массив P(N) (N<=60). Если в нем больше отрицательных чисел, все положительные.
Сообщение было отмечено MarinaP как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13
const numsArray = [2, -7, 5, 4, -8, -9, 10]; let hasNegative = false; for( let i = 0; i numsArray.length; i++) { if (numsArray[i] 0) { hasNegative = true; break; } } if (hasNegative) { console.log('At least one element in array is negative'); } else { console.log('Array all elements are positive'); }
Сообщение было отмечено MarinaP как решение
Решение
MarinaP, решение amr-now верное, но если использовать современный метод some можно написать ещё короче:
const numsArray = [2, -7, 5, 4, -8, -9, 10]; if (numsArray.some(el => el 0)) { console.log('At least one element in array is negative'); } else { console.log('Array all elements are positive'); }
const numsArray = [2, -7, 5, 4, -8, -9, 10]; let i = 0; for( i = 0; i numsArray.length; i++) // Мне кажется, здесь должно быть строгое неравенство. if (numsArray[i] 0) break; if (i numsArray.length) console.log('At least one element in array is negative'); else console.log('Array all elements are positive');
Сообщение от Байт
В данном случае оно ничего не изменило бы. Так как условие i < numsArray.length, начальном значение i - 0, шаг 1, следовательно условие цикла будет выполнятся только тогда, когда i < numsArray.length =>i !== numsArray.length.
Тем более в циклах принято писать i < value, так как область значений i < value всегда меньше области значений i !== value, и помимо прочего это теоретически позволяет избежать ошибок, типа такой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
const arr = [1,2,3,4,5]; // цикл после резкого увеличения i прекратится, так как i вышло за пределы условия i < arr.lengthfor (let i = 0; i arr.length; i++) { console.log(arr[i]); if (i === 3) i += 100; } // а тут цикл продолжится, так как i никогда не станет равно arr.length (поскольку сразу станет 103 и затем будет только прибавляться) // АККУРАТНО. БЕСКОНЕЧНЫЙ ЦИКЛ for (let i = 0; i !== arr.length; i++) { console.log(arr[i]); if (i === 3) i += 100; }
С таким как у вас форматированием, js скоро станет питоном ))
Найти индексы положительных элементов в массиве в JavaScript
Может кто-нибудь сказать мне, что не так? Я считаю, что моя функция карты правильная, но с findIndex() что-то не так. (Пожалуйста, не говорите мне код, поскольку речь идет о моем задании. Нужны только подсказки.)
4 ответа
function pos(arr) < var res = []; for (const [index, el] of arr.entries()) if (el >0) res.push(index) return res; >
function pos(arr) < return arr.map((ele, index) =>[ele, index]) .filter(([ele]) => ele > 0) .map(([_, origIndex]) => origIndex); >
function pos(arr) < return arr.map((ele, index) =>ele > 0 ? index : null) .filter(index => index !== null); >
Зачем вам map и filter делая несколько проходов через массивы, а не один проход с помощью reduce ? Если исходный массив содержит все положительные числа, вы посмотрите на каждое из них дважды.
@MarkMeyer Поскольку я не хочу сводить его к одному значению, я хочу сохранить массив. И есть четкое сопоставление один-к-одному или ни к чему, где map и filter превосходны. Решение reduce эквивалентно написанному мною циклу for … of (но он либо менее эффективен, либо дает ему «функциональное прикосновение», которого не должно быть).
@MarkMeyer Если вы спорите об одном проходе против нескольких проходов, вы можете изучить преобразователи, позволяющие объединить обратные вызовы в один проход, или реализовать (индексированный) эквивалент mapMaybe для JS.
Я предполагаю, что аргумент, что сокращение только для отдельных значений может иметь некоторый смысл, но я не вижу его в обычной практике — люди постоянно используют его для создания хеш-таблиц, объектов и других вещей, которые не являются отдельными значениями. Что касается эффективности — снижение, по-видимому, выигрывает, по крайней мере, в сафари и chrome: jsperf.com/map-filter-or-reduce через я подозреваю, что обычный цикл for а не for. of все равно победит.
@MarkMeyer Я считаю, что хеш-таблица (и другие композиты) также является отдельным объектом — моя точка зрения заключалась в том, что тип вывода по-прежнему является массивом, а также о размере входного массива.
Думаю, я просто буду доволен уважительным несогласием — если можно считать хеш-таблицу отдельной сущностью, можно считать массив индексов одной сущностью. Я ценю обсуждение — спасибо.
@MarkMeyer Да, мы можем считать это так. И, конечно, с помощью reduce он работает более гибко и универсально, чем map . Во многих функциональных языках map даже реализована с точки зрения reduce . Так почему же мы вообще используем map (или filter ), если мы всегда можем использовать reduce ? Поскольку это проще — нам не нужно указывать начальное значение [] , нам не нужно использовать push (или перечислить cons)!
@MarkMeyer При сокращении до хеш-таблицы у нас просто нет выбора — если бы была доступна функция прямого преобразования, мы бы ее использовали. Или на самом деле есть: вместо arr.reduce((m, x) => m.set(x.key, x.value), new Map) мы могли бы использовать более чистую new Map(arr.map(x => [x.key, x.value])) . То же самое здесь: это была filter_mapi функция в JS, все будут использовать его вместо того , чтобы reduce . В своем ответе я просто попытался реализовать это, используя filter + map отдельности.
Сначала вы можете сопоставить индекс, если значение положительное или -1 а затем фильтровать массив для существующих индексов.
Array#map возвращает новый массив с индексом элемента или -1 если элемент меньше нуля.
Array#filter возвращает все значения, которые не являются -1 . Короткое добавление только одного возвращает истинное значение, которое является возможным индексом.
function pos(array) < return array // [1, -4, 0, 5, 2] .map((v, i) =>v < 0 ? -1 : i) // [0, -1, 2, 3, 4] .filter(i =>i + 1); // [0, 2, 3, 4] > console.log(pos([1, -4, 0, 5, 2]));
Ваш обратный вызов для сопоставления
function pos(arr) < return arr.map(function (ele) < return arr.findIndex(ele =>ele > 0); >); > console.log(pos([1, -4, 0, 5, 2]));
не принимает элемент, потому что первая элемен- ele переменная никогда не будет использоваться позже. Затем вы всегда возвращаете индекс первого элемента arr , который равен 1 . Это значение больше как ноль, и обратный вызов для find возвращает true abd, набирает руки над фактическим индексом.
Делаем элементы массива положительными в Javascript
У меня есть следующий массив в Javascript. Я хочу найти число, которое нужно добавить с каждым элементом в этом массиве, чтобы он содержал только положительные числа.
Здесь я хочу сместить все значения на положительную ось X на графике, график должен выглядеть так же, но он должен быть только на положительной оси X.
[‘0.000002’, ‘-0.000007’, ‘0.000026’, ‘-0.000043’, ‘-0.000029’, ‘-0.000021’, ‘-0.000023’]3 ответа
const values = ['0.000002', '-0.000007', '0.000026', '-0.000043', '-0.000029', '-0.000021', '-0.000023'];
Задача здесь — найти положительное число, которое можно добавить к каждому элементу в массиве, чтобы сделать их положительными. Следовательно, лучший способ продолжить — найти наиболее отрицательное число в массиве. Это делается путем предварительного отображения всех строковых чисел в числовой форме. Затем положительные числа отфильтровываются. Далее массив сортируется в порядке возрастания. Наконец, первый элемент в массиве является самым отрицательным числом.
const mostNegativeNumber = values.map(value => +value) .filter(value => value < 0) .sort((x, y) =>x - y) .shift();
Ответ здесь — любое число, которое больше, чем противоположность этого отрицательного числа.
console.log(`Add any number that is greater than $.`);
В математических терминах вы хотите absolute value числа. В JavaScript это Math.abs() .
var positiveArray = ['0.000002', '-0.000007', '0.000026', '-0.000043', '-0.000029', '-0.000021', '-0.000023'].map(Math.abs) console.log(positiveArray)
Используйте Math.abs абсолютное значение. Помните, что это сделает элементы в вашем массиве номерами, в то время как в исходном массиве есть строки.
var a = ['0.000002', '-0.000007', '0.000026', '-0.000043', '-0.000029', '-0.000021', '-0.000023']; a = a.map(function(o)< return Math.abs(o); >); console.log(a);