Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.01.2014, 22:46
Новичок на форуме
Отправить личное сообщение для idriverx Посмотреть профиль Найти все сообщения от idriverx
 
Регистрация: 02.01.2014
Сообщений: 4

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

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

(Другими словами, из следующего фрагмента кода, надо, чтобы после вызова функции, массив 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>"), не выходит. Я хочу чтобы после вызова функции, массив поменялся, и всегда выдавалось без пропусков.

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

Что-то я конкретно туплю
Ответить с цитированием
  #2 (permalink)  
Старый 02.01.2014, 22:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

idriverx,
http://learn.javascript.ru/array-methods#метод-splice
Ответить с цитированием
  #3 (permalink)  
Старый 02.01.2014, 23:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

idriverx,

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

Последний раз редактировалось рони, 02.01.2014 в 23:20.
Ответить с цитированием
  #4 (permalink)  
Старый 02.01.2014, 23:26
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

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

Но это лишнее, потому что
Сообщение от idriverx
и чтобы выводилось только строки и числа
Так что:
.filter(function (item) {
    return typeof item == "string" || typeof item == "number"; // ну и можно на instanceof при желании)
})
Ответить с цитированием
  #5 (permalink)  
Старый 02.01.2014, 23:26
Новичок на форуме
Отправить личное сообщение для idriverx Посмотреть профиль Найти все сообщения от idriverx
 
Регистрация: 02.01.2014
Сообщений: 4

рони,
BallsShaped

спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 02.01.2014, 23:57
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

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 медленнее.
Ответить с цитированием
  #7 (permalink)  
Старый 03.01.2014, 01:08
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от Demath
что быстрей удаляет. Обычно filter медленнее
Пох на скорость. Лично мне вариант с .filter больше нравится, потому что сразу видно что происходит. Собственно, как по мне, так в этом и мякотка, что можно писать код, который сам себя комментирует.
Ответить с цитированием
  #8 (permalink)  
Старый 03.01.2014, 14:48
Новичок на форуме
Отправить личное сообщение для idriverx Посмотреть профиль Найти все сообщения от idriverx
 
Регистрация: 02.01.2014
Сообщений: 4

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

Сегодня сделал что-то типо такого, удивительно, но работает
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); // и там, и там без пропусков

Последний раз редактировалось idriverx, 03.01.2014 в 19:56.
Ответить с цитированием
  #9 (permalink)  
Старый 03.01.2014, 15:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

idriverx,
а если число нуль или строка но пустая ? )))
Ответить с цитированием
  #10 (permalink)  
Старый 03.01.2014, 19:59
Новичок на форуме
Отправить личное сообщение для idriverx Посмотреть профиль Найти все сообщения от idriverx
 
Регистрация: 02.01.2014
Сообщений: 4

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с функцией load valent1224 AJAX и COMET 1 15.04.2011 22:50
проблема с функцией load() sugoj jQuery 3 07.10.2010 22:07
Проблема с функцией Hyjak Общие вопросы Javascript 0 21.06.2010 14:30
Проблема с функцией события Daniar Элементы интерфейса 2 19.08.2009 04:18
Проблема c функцией click() в MOZILLA JackM Общие вопросы Javascript 4 24.03.2009 16:51