Вывести только отрицательные числа и их сумму, проигрывая циклы и массивы
Мне нужна помощь с программой, я должен использовать цикл для вывода всех отрицательных целых чисел и их суммы. Я должен использовать только базовый метод.
Отрицательные целые числа: -2, -1, -7 <---- // Без запятой в конце.
Сумма отрицательных чисел: -10
Когда я запускаю свою программу, последние целые числа имеют дополнительную запятую в конце, я не могу вывести ее с помощью "if (i!= Array.length-1)", потому что последний элемент в моем массиве положительный, но цикл анализирует что есть пустой элемент. Как я могу удалить эту запятую логическим способом. Результат нужно вывести внутри цикла через запятую: (", ").
function negativeArray(array)
{
document.write("Negative integers: ")
for (var i = 0, count = 0; i < array.length; i++)
{
if (array[i] != undefined && array[i] < 0){
document.write(array[i]);
count += array[i];
if (i != array.length-1) document.write(", ")}
}
document.write( "<br>Sum negative nums: " + count)
}
var items = [1, -2, 3, 4 -5, 6, -7, 8];
negativeArray(items);
6 ответов
Более простой подход с использованием filter
, join
а также reduce
:
var items = [1, -2, 3, 4 - 5, 6, -7, 8];
document.write(
"Negative integers: ",
items.filter(item => item < 0).join(", ")
);
document.write(
"<br>Sum negative nums: ",
items.reduce((acc, current) => acc + (current < 0 ? current : 0), 0)
);
Вы можете писать намного проще. Сначала отфильтруйте все отрицательные числа, а затем суммируйте.
var items = [1, -2, 3, 4 -5, 6, -7, 8];
function negativeArray(array) {
return array.filter(item => item < 0).reduce((sum, current) => sum + current, 0)
}
console.log(negativeArray(items)); // -10
Проблема в том, что вы проверяете только позицию Array.length-1, тогда как она должна быть Array.length-2. Вот пример кода, который работает:
function negativeArray(array)
{
document.write("Negative integers: ")
for (var i = 0, count = 0; i < array.length; i++)
{
if (array[i] != undefined && array[i] < 0){
document.write(array[i]);
count += array[i];
if (i != array.length-2) {
document.write(", ");
}
}
}
document.write( "<br>Sum negative nums: " + count)
}
var items = [1, -2, 3, 4 -5, 6, -7, 8];
negativeArray(items);
Приведенный выше код идеально подходит для меня, если у вас есть какие-либо вопросы, не стесняйтесь спрашивать меня!
Ваша логика заключается в том, что каждый раз, когда вы зацикливаетесь и находите следующее отрицательное число:
- Запишите это.
- Если выписанное число не было последним элементом массива, напишите ", ".
Во-первых, шаг 2 выше не имеет особого логического смысла, потому что даже если номер может быть не последним элементом массива, он вполне может быть последним отрицательным числом в массиве. Но к настоящему времени вы, вероятно, понимаете, что это может произойти, иначе вы бы не разместили этот вопрос.
Что имеет больше смысла, если вызвать логический флаг didOutput
изначально установлен на false
представляющий, выводили ли вы когда- либо отрицательное число. Это вы устанавливаете вне цикла. Тогда цикл в псевдокоде выглядит так:
didOutput = false;
loop {
get next negative number;
if didOutput then {
write(", ");
}
write number;
didOutput = true;
}
Таким образом, на каждой итерации цикла вы записываете запятую перед записью следующего числа, если и только если вы когда-либо записывали хотя бы одно число. Вам нужно всего лишь изменить одну или две строки в существующем коде, что я мог бы внести, но это шаблон, который будет повторяться снова и снова, и его важно понимать, поэтому вы должны попытаться самостоятельно включить его в свой код.
Эй, могу я тебе помочь:)
Просто возьмите логическое значение типа "first", которое проверяет, является ли он первым элементом, и поместите "," перед своим числом. Вы устанавливаете его в true, после этого вы строите stf как:
If(first == true){
//don t print the „ ,“
first = false
}else {
// print it
}
Ваш код написан с использованием синтаксиса и подхода 1995 года. document.write()
не должен использоваться для получения такого результата, как вы, и вместо for
цикл, массив может быть повторен с помощью множества методов.
В вашем случае лучшим подходом было бы перебрать исходный массив с помощью Array.filter()
, который приводит к получению второго массива значений, соответствующих некоторым установленным вами критериям (в данном случае отрицательные числа). Поскольку результаты будут в массиве, Array.join()
метод выдаст результат в виде строки, разделенной запятыми, где вам не нужно беспокоиться о размещении запятой. Затем вы можете суммировать полученный массив с помощью Array.reduce()
var items = [1, -2, 3, 4 -5, 6, -7, 8];
function negativeArray(array) {
// Use the Array.filter() method to loop
// over an array and produce a new array with
// your desired values
let results = array.filter(function(item){
return item < 0;
});
// .join() will return a comma separated string of the array values
document.getElementById("negatives").textContent = results.join(", ");
// .reduce() will loop over the array and return a single value based on the function passed
document.getElementById("sum").textContent = results.reduce(function(x,y){ return x + y });
}
negativeArray(items);
<!-- Don't use document.write() to add results to the page.
Instead, set up an HTML placeholder for results and populate
it dynamically. -->
<div>Negative Integers: <span id="negatives"></span></div>
<div>Sum of negatives: <span id="sum"></span></div>