Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с функцией (https://javascript.ru/forum/misc/44027-problema-s-funkciejj.html)

idriverx 02.01.2014 22:46

Проблема с функцией
 
Привет всем.

Хочу сделать задачку такую. когда в массиве есть пропуски, их опустить, и чтобы выводилось только строки и числа.

(Другими словами, из следующего фрагмента кода, надо, чтобы после вызова функции, массив testarray поменялся, и выглядил всегда так:

testarray = [44,33, 'DAaaa']

Создал функцию, и вот не догоняю немного.

var testarray = [,,,44,33,,'DAaaa'];
function parse(array) {
   for(var i = 0; i < array.length; i++) {
      if(!array[i]) continue;
      else document.write(array[i] + "<br>");
}
return array;
} 
parse(testarray);


Вся моя ошибка состоит в том что "else document.write(array[i] + "<br>");", но как иначе? пытался и return (array[i] + "<br>"), не выходит. Я хочу чтобы после вызова функции, массив поменялся, и всегда выдавалось без пропусков.

Надеюсь не сильно запутанно написал.

Что-то я конкретно туплю :(

рони 02.01.2014 22:57

idriverx,
http://learn.javascript.ru/array-methods#метод-splice

рони 02.01.2014 23:14

idriverx,
:write:
var testarray = [, , , 44, 33, , 'DAaaa'];
   function parse(array) {
       return array.filter(function (number) {
           return number !== undefined       })
   }
   testarray = parse(testarray)
    alert(testarray)

BallsShaped 02.01.2014 23:26

рони, более "стильно-молодёжно" было бы так:
.filter(function (item, index, array) {
    return index in array;
})

Но это лишнее, потому что
Цитата:

Сообщение от idriverx
и чтобы выводилось только строки и числа

Так что:
.filter(function (item) {
    return typeof item == "string" || typeof item == "number"; // ну и можно на instanceof при желании)
})

idriverx 02.01.2014 23:26

рони,
BallsShaped

спасибо!

Demath 02.01.2014 23:57

Можно ещё сдвинуть нужные элементы в начало массива и обрезать его

function deleteEmpty(arr)
{
    var n = arr.length, k = 0;

    for (var i = 0; i < n; i++)
     { if (arr[i] !== undefined) arr[k++] = arr[i]; }

    arr.length = k;

    return arr;
}

alert( deleteEmpty([,,,44,33,,'DAaaa']) );

P.S. Надо потестировать, что быстрей удаляет. Обычно filter медленнее.

BallsShaped 03.01.2014 01:08

Цитата:

Сообщение от Demath
что быстрей удаляет. Обычно filter медленнее

Пох на скорость. Лично мне вариант с .filter больше нравится, потому что сразу видно что происходит. Собственно, как по мне, так в этом и мякотка, что можно писать код, который сам себя комментирует.

idriverx 03.01.2014 14:48

Спасибо всем за помощь!

Сегодня сделал что-то типо такого, удивительно, но работает :)
var array = [,,,3,4,7,,,,'DDaa','dd'];
  var emptyarray = [];
  function parse(from,to) {
    for(var i = 0; i < from.length; i++) {
      if(!from[i]) continue;
      else to.push(from[i]);
    }
    return to;
  }
  parse(array, emptyarray);

  array = emptyarray;
  document.write(emptyarray + " " + array); // и там, и там без пропусков

рони 03.01.2014 15:52

idriverx,
а если число нуль или строка но пустая ? )))

idriverx 03.01.2014 19:59

рони,
а я еще проверку для нуля сделаю )
if(from[i] == 0) to.push(from[i]);


Часовой пояс GMT +3, время: 04:10.