02.01.2014, 22:46
|
Новичок на форуме
|
|
Регистрация: 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>"), не выходит. Я хочу чтобы после вызова функции, массив поменялся, и всегда выдавалось без пропусков.
Надеюсь не сильно запутанно написал.
Что-то я конкретно туплю
|
|
02.01.2014, 22:57
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
|
|
02.01.2014, 23:14
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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.
|
|
02.01.2014, 23:26
|
Профессор
|
|
Регистрация: 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 при желании)
})
|
|
02.01.2014, 23:26
|
Новичок на форуме
|
|
Регистрация: 02.01.2014
Сообщений: 4
|
|
рони,
BallsShaped
спасибо!
|
|
02.01.2014, 23:57
|
|
Профессор
|
|
Регистрация: 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 медленнее.
|
|
03.01.2014, 01:08
|
Профессор
|
|
Регистрация: 14.09.2012
Сообщений: 162
|
|
Сообщение от Demath
|
что быстрей удаляет. Обычно filter медленнее
|
Пох на скорость. Лично мне вариант с .filter больше нравится, потому что сразу видно что происходит. Собственно, как по мне, так в этом и мякотка, что можно писать код, который сам себя комментирует.
|
|
03.01.2014, 14:48
|
Новичок на форуме
|
|
Регистрация: 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.
|
|
03.01.2014, 15:52
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
idriverx,
а если число нуль или строка но пустая ? )))
|
|
03.01.2014, 19:59
|
Новичок на форуме
|
|
Регистрация: 02.01.2014
Сообщений: 4
|
|
рони,
а я еще проверку для нуля сделаю )
if(from[i] == 0) to.push(from[i]);
|
|
|
|