2015-07-26 2 views
0

Может ли кто-нибудь объяснить мне, почему мой код не работает?Невозможно вставить число при заданном индексе массива

Он должен разместить второй arg (3) между arr ([1,5]). Но единственное, о чем мне говорит JS, - «3».

function where(arr, num){ 
    for(var i=0;i<arr.length;i++){ 
    if(arr[i] < num){ 
     slice(arr[i+1,0,num]) 
    } 
    else if(arr[i] > num){ 
     slice(arr[i+1,0,num]) 
    } 
    } 
    return arr; 
} 
where = ([1, 5],3); 

Пожалуйста, знайте, я только что начал JS, поэтому мои знания ограничены. Любые предложения или помощь очень ценятся.

+1

Если мы предположим, что массив упорядочен? Почему вы переписываете 'where'? Что такое 'slice'? Как 'slice' должен модифицировать' arr', если он не получает никакой ссылки на него? Может быть, вы имеете в виду 'arr.slice'? – Oriol

+0

Что вы хотите сделать точно? Поместите 'num' в правильную позицию, предполагая, что массив упорядочен? –

ответ

1

Здесь есть несколько проблем.

  1. Методы должны быть вызваны через массив. то есть arr.slice(), тогда как slice(...) выдаст ошибку.
  2. slice не добавляется в массив. Он удаляет из массива. Вам нужно будет использовать splice.
  3. Использование цикла for здесь, как и вы, это не лучший подход, потому что он будет продолжать работу после того, как вы вставляете элемент. По сути, вы хотите вставить элемент в упорядоченный список? Если это так, выйдите из функции с return, как только вы вставьте элемент, или используйте break.

Ваша функция может выглядеть следующим образом:

function where (arr, num) { 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] > num) { 
     // Inserts num at i 
     arr.splice(i, 0, num); 
     return arr; 
    } 
    } 
    // If it's the highest num, add to the end of the array. 
    arr.push(num); 
    return arr; 
} 

var newArray = where([1, 5], 3); 

Однако, ваш вопрос немного неоднозначным, так что если вы пытаетесь вставить элемент в определенный индекс, вы можете просто использовать сращивания напрямую :

var arr = [1, 5]; 
// Inserts 3 at index of 1 
arr.splice(1, 0, 3); 
// arr becomes [1, 3, 5] 
+0

Спасибо за ваше объяснение! Ты действительно помог мне здесь. –

+0

Рад это услышать. Если вы настроены, вы должны принять ответ, чтобы люди знали, что на этот вопрос был дан достаточный ответ. – EmptyArsenal

0

Я не уверен, что вы пытаетесь сделать здесь, но:

  • Я не думаю, что функция «slice» делает то, что вы ожидаете; Вы должны вызвать его на массив, см here, и он возвращает новый массив, поэтому вы должны присвоить результат к чему-то

  • Однако Причина вы видите только (3) происходит потому, что вы никогда не называют ẁhere функция, который вы определяете. Вместо этого вы вычисляете значение ([1,5],3) и влияете на него на новую глобальную переменную с именем where.

Причина, почему ([1,5],3) имеет значение "3" из-за comma operator.В основном:

([1,5],3) 

такая же, как

[1,5],3 

который оценивает как [1,5] и 3, и возвращает последнее оценочное значение (3)

Попробуйте изменить последнюю строку фактического вызова функции :

var result = where([1, 5],3); 

Вы получите ошибки из-за того, как вы назвали срез; надеюсь, с документом вы должны увидеть, как заставить его работать.

Кроме того, как указано в другом месте, slice может не быть функцией, которую вы хотите вызвать в первую очередь.

+0

Спасибо за ваше объяснение! –

+0

Добро пожаловать! Как указано в другом месте, не стесняйтесь отмечать один из ответов как «Принято», а не использовать комментарии «Спасибо»! (См. Http://meta.stackexchange.com/a/17886 для обсуждения этого вопроса.) – phtrivier

0

Я думаю, что вы хотите что-то вроде dichotomic search и arr.splice в правильном положении:

function insertItemInOrderedArray(arr, item, from, to) { 
    if(from === undefined) from = 0; 
    if(to === undefined) to = arr.length; 
    if(from >= to) return arr.splice(from, 0, item), arr; 
    var m = (from + to)/2 | 0; 
    if(arr[m] > item) return insertItemInOrderedArray(arr, item, from, m); 
    if(arr[m] < item) return insertItemInOrderedArray(arr, item, m+1, to); 
    return arr; 
} 
insertItemInOrderedArray([1,5], 3); // [1,3,5] 
+0

Спасибо за ваше объяснение! –

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