2014-12-18 2 views
0

Я просто изучаю JavaScript и работаю над проблемой, когда сортирую массив чисел в нечетные и четные массивы.Проблема, связанная с сортировкой массива чисел в evens и odds

Чтобы проверить, успешна ли я, я «предупреждаю» массивы в конце (и ожидаю увидеть четные числа в первом предупреждении, нечетные числа во втором алете). Однако все, что я пытаюсь, не сработало; Я просто получаю предупреждение с 1, затем пустым предупреждением.

Может ли кто-нибудь сказать мне, почему это не работает?

var numbs = [1, 2, 34, 54, 55, 34, 32, 11, 19, 17, 54, 66, 13]; 
Sort(numbs); 

function Sort(nums) { 

    var evens = []; 
    var odds = []; 
    for (var i = 0; i < arguments.length; i++) { 

     if (nums[i] % 2) { 
      evens.push(nums[i]); 
     } else { 
      odds.push(nums[i]); 
     } 
    } 
    alert(evens.toString()); 
    alert(odds.toString()); 
} 

ответ

3
for (var i = 0; i < arguments.length; i++) { 
        ^^^^^^^^^^^^^^^^ 

Это ваша проблема. arguments относится к массиву всех аргументов, переданных функции (например, значение arguments для function(a, b, c) - [a, b, c]). Поэтому в вашем случае arguments.length будет 1, так как есть только один аргумент.

На самом деле, как вы, возможно, собрали, использование arguments часто не нужно. Как правило, вы можете просто проверить, являются ли аргументы undefined, если вы хотите знать, были ли они предоставлены или нет, а использование arguments значительно сократит ваш код. Вероятно, вам почти не придется использовать arguments в вашем коде.

Просто замените эту строку с:

for (var i = 0; i < nums.length; i++) { 

Несколько других наблюдений:

  • Ваше if состояние переворачивается-он определяет, является ли число нечетное, даже. Переверните тела операторов if и else или используйте вместо этого что-то вроде nums[i] % 2 !== 1.

  • Вы используете numbs как локальную переменную перед вызовом функции, а затем вызываете ее nums. Зачем? Это кажется странным и запутанным, и стандартизация одного имени поможет уменьшить ошибки в будущем. (Вы также могли бы назвать их, скажем, userAges вне функции и nums внутри, если вы передаете что-то конкретное к нему.)

  • Ваша функция называется Sort с капиталом S. Это необычно, потому что стандартные соглашения об именах для JavaScript диктуют, что переменные и функции должны быть camelCased, то есть начиная с строчной буквы и иметь заглавные буквы, чтобы отличать новые слова.

  • Отступ, кажется, довольно неустойчивый. Это затрудняет чтение кода. Попробуйте использовать IDE или какой-то текстовый редактор, который автоматически отпечатает ваш код, делая его намного проще для чтения.

+0

Кроме того, ОП объявляет массив чисел как «numbs», но ссылается на переменные 'nums' для остальной части функции. – tymeJV

+0

@tymeJV Это странно, но не проблема, потому что он объявляет эту функцию как 'function Sort (nums)'. – Doorknob

+0

Да, это все. Я подтвержу это как ответ через 10 минут, когда это позволит мне. Спасибо! – snowkid314

0

Вы были очень близки вам просто нужно сделать несколько изменений нуждается

Первое изменение заключается в изменении arguments.length к nums.length поскольку вы передаете массив в качестве параметра вы используя его длину.

Второе изменение необходимо, чтобы изменить его в вашем случае тогда заявление:

nums[i] % 2 

к:

nums[i] % 2 === 0 

В настоящее время вы не хранить даже цифры в массиве эвенов.

JavaScript:

var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13]; 
Sort(numbs); 
function Sort(nums) { 

var evens = []; 
var odds = []; 
for (var i = 0; i < nums.length; i++) {//<---change number 1 

if (nums[i] % 2 === 0){ //<--- change number 2 if the remainder = 0 it is even 
     evens.push(nums[i]); 
     } 
     else { 
     odds.push(nums[i]); 
     } 
    } 
alert(evens.toString()); 
alert(odds.toString()); 
} 
1

Вам нужно сделать пару исправлений (и должен очистить ваш код форматирование немного для удобства чтения & ремонтопригодности - как я сделал ниже):

var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13]; 
 
Sort(numbs); 
 

 
function Sort(nums) { 
 
    var evens = []; 
 
    var odds = []; 
 

 
    //alert(arguments.length); // for debugging 
 
    for (var i = 0; i < nums.length; i++) { // nums.length per commentary below 
 
    //for (var i = 0; i < arguments.length; i++) { 
 
     if (nums[i]%2){ 
 
      odds.push(nums[i]); // odds, not evens per commentary below 
 
      //evens.push(nums[i]); 
 
     } 
 
     else { 
 
      evens.push(nums[i]); // evens, not odds per commentary below 
 
      //odds.push(nums[i]); 
 
     } 
 
    } 
 

 
    alert(evens.toString()); 
 
    alert(odds.toString()); 
 
}

arguments.length - количество аргументов, переданных функции func а не длина массива, переданного в качестве единственного аргумента в этом случае (т. arguments[0].length); кроме того, нет оснований для использования массива arguments вообще, когда вы можете ссылаться на именованный параметр (то есть nums).

Кроме того, ваша логика evens/odds flip-flopped.

0

Попробуйте следующий код, он принимает массив, numbs и сортирует его и вставляет нечетные числа в нечетной массиве, и четные числа в четном массив:

var numbs = [1,2,34,54,55,34,32,11,19,17,54,66,13]; 
Sort(numbs); 

var evens = []; 
var odds = []; 

function Sort(nums) { 

    for (var i = 0; i < nums.length; ++i) { 
     if ((nums[i] % 2) === 0) { 
      evens.push(nums[i]); 
     } 
     if ((nums[i] % 2) == 1) { 
      odds.push(nums[i]); 
     } 
    } 
    alert(evens); 
    alert(odds); 
} 
1

answer из @Doorknob 冰 захватов очень хорошо суть того, что пошло не так, и описывает, как вы можете это исправить.

Но если вы заинтересованы в несколько более продвинутой техники, то этот код будет работать, и это, на мой взгляд, гораздо более элегантна:

var isEven = function(n) {return n % 2 === 0;}; 
var isOdd = function(n) {return n % 2 !== 0;}; 

numbs.filter(isEven); //=> [2, 34, 54, 34, 32, 54, 66] 
numbs.filter(isOdd); //=> [1, 55, 11, 19, 17, 13] 

Другими словами, работа вы выполнение фильтрации элементов уже является встроенным методом в прототипе массива. Вам просто нужно определить предикатные функции для использования с ним, например isEven и isOdd.

(Обратите внимание, что тест в isOdd не n % 2 === 1, так как оператор % немного отличается от математической операции модуля, и возвращает отрицательное значение, если делимое отрицательно.)

Смежные вопросы