Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удалить из массива пустые элементы (https://javascript.ru/forum/misc/45065-udalit-iz-massiva-pustye-ehlementy.html)

dima*** 12.02.2014 19:56

Удалить из массива пустые элементы
 
Нужно удалить из массива пустые элементы.Поискал в интернете -несколько вариантов нашёл.А ,вообще,есть какой-нибудь "стандартный способ"?

skrudjmakdak 12.02.2014 20:14

например, можно так:
<html>
	<head>
		<title>example</title>
	</head>
	<body>
		<script>
Array.prototype.clear = function ()
	{
	this.forEach(function (el, b, c)
		{
		if (el == undefined || el == null)
			c.splice(b, 1);
		});
	}


var myArray = [undefined, 4, 6, 7, -1, null];

myArray.clear();
console.log(myArray);

		</script>
	</body>
</html>


можно извратиться так: )))
<html>
	<head>
		<title>example</title>
	</head>
	<body>
		<script>
Array.prototype.clear = function ()
	{
	this.forEach(function (el, b, c)
		{
		if (el == undefined || el == null)
			c.splice(b, 1);
		});
	return this;
	}

Array.prototype.alert = function ()
	{
	alert(this.join('; '));
	}

var myArray = [undefined, 4, 6, 7, -1, null];
myArray.clear().alert();

		</script>
	</body>
</html>

dima*** 12.02.2014 20:30

skrudjmakdak,спасибо!
А,где изучают ЯВАСКРИПТ?В университете или в колледже изучают?

skrudjmakdak 12.02.2014 20:38

вот смотри еще прикол. (у меня хром) заходишь в фаербаг, в консоль.. и там пишешь
"Array.prototype", потом ставишь точку и у тебя высветится список свойств и методов этого класса

вот я тебе заскринил:


конечно он не дает описание, но если ты знаешь английский, то примерно понять можно.. а еще лучше загуглись.. посм описание этого свойства или метода..
или прям в консоле можешь прописать:
var t = [1, 2, 3];
t.join(';');

и у тебя выпадит в консоль результат

также можешь прописать "String.prototype." и у тебя вывалит список свойств и методов класса строки.
вообщем консоль это супер!

или например вот: document.querySelector('body');
найдет тебе боди. вообщем можешь пользоваться на полную катушку..

я самостоятельно изучал. с третьего курса начал потихоньку..

dima*** 12.02.2014 20:46

Спасибо:)
А я ещё думал зачем эта "хрень".Понятно,теперь!!!Отк да всё берётся!
Как вы помогаете!!!:thanks:
С консолью в хроме!Теперь с этим!Разберусь!Спасибо,огр мное!
И никто,кроме,вас не подсказал!!!

рони 12.02.2014 20:51

Цитата:

Сообщение от skrudjmakdak
вот я тебе заскринил:

ишь ты :write: :victory:

dima*** 12.02.2014 21:04

рони,а почему ты мне перестал помогать?Я,совсем не понимаю ничего?
Ты очень здорово мне помог!
Нет у меня никаких навыков программирования-поэтому всё так тяжело даётся.

skrudjmakdak 12.02.2014 21:07

Цитата:

Сообщение от dima*** (Сообщение 297356)
Нет у меня никаких навыков программирования-поэтому всё так тяжело даётся.

ну дак, а спортсменами за 2 дня становятся? так и программирование, ГОДЫ ТРЕНИРОВОК. тысячи строк кода! не иначе!!

я думаю те не так уж и много лет, имхо)) поэтому все еще впереди))

dima*** 12.02.2014 21:20

Да,я только ЗА!!!За ТРЕНИРОВКИ!
рони-помогал, начал что-то понимать.Потом,опять-провал.
Нет такого на учебных сайтах,например:
b[i]=b[i].split(" ");
Проблема не в split(" "),а в b[i]=b[i]......,что так можно сделать:(

skrudjmakdak 12.02.2014 21:29

а что находится в b[i]?

dima*** 12.02.2014 21:41

Да,это неважно,что там!Смысл в том,что нигде не написано,что так можно сделать!!!По многомерным массивам нет информации,нет примеров.

skrudjmakdak 12.02.2014 21:48

эээ?? многомерным массивам?? открою тебе секрет, что в js нет многомерных массивов. можно сделать массив с массивами. т.е. указатель на массив

dima*** 12.02.2014 21:57

Это не секрет.Я знаю,что в яваскрипт нет многомерных массивов.Что в яваскрипте -это называется "массив с массивами".
Разница в чём,опять не понятно?
Большая просьба,только не обижаться!!!:)

dima*** 12.02.2014 22:00

Просто,на сайтах с математическим уклоном их называют многомерными,а с программированным-массивы в массивах(много раз встречал).

skrudjmakdak 12.02.2014 22:06

Сложно так объяснять.
вот например есть обычный массив
var t = [1, 2, 3];
console.log(t[1]);
будет 2.

а если создать еще один массив:
var r = [6, 7, 8];

а потом запхать его в первый:
t[1] = r;
то у тебя получится что в t[1] храниться указатель на массив r
console.log(t[1]);

dima*** 12.02.2014 22:27

Это,если так.А если:var a=[[1,2],[3,4],[5,6]];
Так нельзя его назвать многомерным?(я уточняю...)
Как бы на сленге,что ли..

skrudjmakdak 12.02.2014 23:19

можно. но понимать нужно, что на деле у тебя 4 массива
первый это [1,2]
второй это [3,4]
третий это [5,6]
и четвертый это как раз массив указателей, в котором хранятся ссылки. в первом элементе хранится ссылка на первый массив, во втором элемент ссылка на второй и т.д.
a[0] - ссылка на массив [1,2]; console.log(a[0]);

Makarov 13.02.2014 00:05

Цитата:

Сообщение от skrudjmakdak (Сообщение 297395)
и четвертый это как раз массив указателей, в котором хранятся ссылки.

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

dima*** 13.02.2014 08:18

В консоле получается:
a[0]
[1, 2]
a[1]
[3, 4]
a[2]
[5, 6]
a[3]
undefined
a[4]
undefined
А четвёртый где,массив указателей?Как его найти?

skrudjmakdak 13.02.2014 15:29

Цитата:

Сообщение от Makarov (Сообщение 297400)
Насколько я знаю, обычно у новичков и людей не связанных с программированием на таких оборотах обычно вытекает мозг =D

ахахаха, ты был прав)))

skrudjmakdak 13.02.2014 15:33

Цитата:

Сообщение от dima*** (Сообщение 297410)
А четвёртый где,массив указателей?Как его найти?

жжёшь))) честно говоря я не знаю как показать еще. видимо программистами рождаются, массивы должны быть у тебя в крови))

skrudjmakdak 13.02.2014 15:35

а что у тебя должно вывалить когда ты обращаешься к a[3] или a[4]?? какой результат ты хотел получить?

dima*** 13.02.2014 19:30

массив указателей это и есть а=[]?

dima*** 13.02.2014 19:42

a[3] или a[4]-думал увидеть undefined.Мучает вопрос-почему "четвёртый"?

skrudjmakdak 13.02.2014 19:59

Цитата:

Сообщение от dima*** (Сообщение 297519)
массив указателей это и есть а=[]?

да.

var a1 = [1, 2]; //это 1ый ОДНОМЕРНЫЙ массив
var a2 = [3, 4]; //это 2ой ОДНОМЕРНЫЙ массив
var a3 = [5, 6]; //это 3ий ОДНОМЕРНЫЙ массив
var a4 = [a1, a2, a3]; //это 4ый ОДНОМЕРНЫЙ массив. содержит ссылки на 1, 2 и 3 ОДНОМЕРНЫЙ массив

вот это все, равносильно тому что ты писал:
var a4 = [[1,2], [3,4], [5,6]]; //т.е. это "сложный" массив

а выше я тебе его же разбил на "простые" массивы

kobezzza 13.02.2014 20:00

Цитата:

Сообщение от dima*** (Сообщение 297379)
Разница в чём,опять не понятно?

Многомерный массив - это удобная абстракция, т.е. внутри реализации это всё тот же одномерный один массив, а массив массивов - это такой массив, элементами которого являются другие массивы.

Массивы массивов более гибкие, т.к. не накладывают ограничений на длину вложенных массивов:

[
  [1, 2] // вложенный массив с 2-мя элементами,
  [1] // вложенный массив с 1-м элементом
]


При реализации многомерного массива мы сразу декларируем, что размер вложенных масcивов должен быть равен n, где n некоторое целое число, т.е. получается меньше гибкости, но зато работает быстрее.

dima*** 13.02.2014 20:53

Ага,я так и понимал.Просто,смутило-"четвёртый".Ладно,здесь понятно.Я,думал,что не так уже.

kobezzza,понял!Длина массива, вот в чём дело!

p.s.:у меня в школе не было программирования!Изучал яваскрипт самостоятельно по Дунаеву.Первый язык программирования.Бейсик и С++ не изучал.Поэтому ,наверное,и не понимаю простые вещи.

Дзен-трансгуманист 13.02.2014 21:15

Цитата:

Сообщение от dima***
Разница в чём,опять не понятно?

Цитата:

Сообщение от kobezzza
Многомерный массив - это удобная абстракция, т.е. внутри реализации это всё тот же одномерный один массив, а массив массивов - это такой массив, элементами которого являются другие массивы.

Массивы массивов более гибкие, т.к. не накладывают ограничений на длину вложенных массивов


dima***,
Поскольку ты новичок, я думаю, тут не помешает разжевать и дополнить ответ kobezzza для ясности.

Понятие массива в программировании не всегда задано однозначно. В общем случае так называется объект, объединяющий некоторое множество других, доступных каждый напрямую по своему индексу. При этом организация внутренней механики, ограничения на тип хранимых внутри объектов и дополнительный функционал опускаются для упрощения - обычно все тонкости понятны из контекста.

В JS массивом изначально считается встроенный тип объектов, который допускает произвольную манипуляцию набором данных: они могут быть любого типа, их можно добавлять и удалять как угодно, а сам размер ограничен только самим движком JS.

В других языках, приложениях и всевозможных абстрактных и предметно-ориентированных моделях точное определение может быть другим. Например, в C/C++ массив это ничто иное, как цельный блок памяти, который интерпретируется как неразрывная последовательность элементов одного и того же типа и размера. Там мы не можем просто так взять и вырезать какой-то элемент, чтобы дырка между соседями свернулась сама собой: для этого пришлось быть передвинуть весь хвост справа на позицию назад, а это могут быть мега- и гигабайты памяти! Такие простые структуры непосредственно используются, как правило, только для данных фиксированной длины с жесткой привязкой к индексу.

Так вот, когда говорят о многомерных массивах, часто подразумеваются именно такие. Дело в том, что одномерный массив как линейный блок памяти легко превращается в многомерный, если применить к функции индекса простые арифметические преобразования. Это имеет смысл, так как доступ к данным происходит максимально быстро, а поддержание объекта в действии не накладывает никаких неявных издержек в виде сложных вычислений или дополнительной памяти.

Например, нужен массив [5][6][7]. Объем его одномерного аналога будет 5*6*7 = 210 элементов. Можно однозначно сопоставить вариации трех координат одному диапазону чисел. Если наша иерархия индексов [x][y][z], то преобразование к одномерному виду будет i = (x*6 + y)*7 + z.

И хотя в JS обычные массивы позволяют работать с ними КАК с многомерными, внутренняя их топология все же остается свободной для изменений. В связи с этим иногда возникает путаница в толковании.

Тем не менее, уже несколько лет как в оборот введены Typed Arrays, являющиеся примером простого, но жесткого варианта. Однако типы их содержимого на данный момент ограничены только числовыми.

рони 13.02.2014 21:32

Цитата:

Сообщение от Дзен-трансгуманист
i = (x*6 + y)*7 + z

i должно быть в данном случае от 0 до 210 или я что-то непонимаю? откуда формула?

Дзен-трансгуманист 13.02.2014 21:37

Цитата:

Сообщение от рони
i должно быть в данном случае от 0 до 210

до 209
var i=[];
for (var x=0; x<5; x++) for (var y=0; y<6; y++) for (var z=0; z<7; z++) i.push((x*6 + y)*7 + z);
console.log(i.join(', '));

рони 13.02.2014 22:08

Дзен-трансгуманист,
маленький универсальный преобразователь к одномерному виду :write: :dance:
function x(c) {
    for (var d = 5, a = 0, b = 0; b < c.length; b++) a *= d, a += c[b], d++;
    return a
};
  alert([x([4]),x([4,5]),x([4,5,6]),x([4,5,6,7])])

Дзен-трансгуманист 13.02.2014 22:21

рони,
Чёто не то наворочено. :)

dima*** 13.02.2014 22:22

А разномерный массив-это правильно?

рони 13.02.2014 22:32

Цитата:

Сообщение от Дзен-трансгуманист
Чёто не то наворочено.

также выдаёт i или что-то нетак?
function m(c) {
    for (var d = 5, a = 0, b = 0; b < c.length; b++) a *= d, a += c[b], d++;
    return a
};
  var i=[];
for (var x=0; x<5; x++) for (var y=0; y<6; y++) for (var z=0; z<7; z++) i.push(m([x,y,z]));
console.log(i.join(', '));

skrudjmakdak 13.02.2014 22:35

вот это действительно наркомания :)

dima*** 13.02.2014 22:41

массив с массивами...указательный массив.
В яваскрипте нет названия для такого массива?
Ссылочный массив пусть будет или тоже неправильно?
А то какая-то "непонятина" получается.

Дзен-трансгуманист 13.02.2014 22:41

Цитата:

Сообщение от dima***
А разномерный массив-это правильно?

Нет, это словесный каламбур. :)

Цитата:

Сообщение от рони
также выдаёт i или что-то нетак?

[4,5] - 29? Что не так? :D

Во-вторых, счет идет с нуля, последний индекс = размер-1.
Я там продемонстрировал, что приведенная в пример формула дает корректный порядок индексов. Естественно, последнее число было на единицу меньше общего размера.

И наконец, я бы даже не догадался, что эта функция должна вычислять размер, если бы начал читать тему с этой страницы. :) Что там за d = 5?

рони 13.02.2014 22:46

Цитата:

Сообщение от Дзен-трансгуманист
[4,5] - 29? Что не так

а что здесь неправильно? 5 * 6 = 30 -- от 0 до 29
Цитата:

Сообщение от Дзен-трансгуманист
Во-вторых, счет идет с нуля, последний индекс = размер-1

у меня всё тоже
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
</head>
<body>
<script>
  function m(c) {
    for (var d = 5, a = 0, b = 0; b < c.length; b++) a *= d, a += c[b], d++;
    return a
};
for (var x=0; x<5; x++) for (var y=0; y<6; y++) document.write('['+ x +','+ y +'] : '+m([x,y])+'<br>');
</script>
</body>
</html>

Дзен-трансгуманист 13.02.2014 23:21

Цитата:

Сообщение от рони
а что здесь неправильно?

Не понимаю, какая связь между [4,5] и 5*6
Обфускация концептуально необходима? :D

Дзен-трансгуманист 13.02.2014 23:23

// Multidimensional to single dimension representation

var m2sdim = ( function () {

  var argNames = 'abcdefghijklmnopqrstuvwxyz'.split('');

  return function ( /* arguments */ ) {

    var dimension = arguments.length;
    var fnSource = argNames[0];
    var size = +arguments[0];

    for ( var i = 1; i < dimension; i++ ) {
      fnSource = '(' + fnSource + '*' + +arguments[i] + '+ +' + argNames[i] + ')';
      size *= +arguments[i];
    }

    var fn = Function.apply( null, argNames.slice( 0, dimension ).concat( 'return ' + fnSource ));
    fn.size = size;

    return fn;
  };
})();

var test = m2sdim(5,6,7,8);

console.log([
  test.toString(),
  test(0,0,0,1),
  test(0,0,1,0),
  test(0,1,0,0),
  test(1,0,0,0),
  test.size // размер массива
].join('\n'));


Как можно догадаться, тут максимум на 26 измерений. Но для примера, думаю, достаточно. :)


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