Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Длина массива в объекте (https://javascript.ru/forum/misc/24496-dlina-massiva-v-obekte.html)

diagnost 02.01.2012 23:47

Длина массива в объекте
 
Имеется скрипт:

<script>

function Lingvo() {
	var Eng = [];
	var Rus = [];
	this.count = 0;
	this.Eng = Eng;
	this.Rus = Rus;
	this.AddEng = function (EngWord) {
		Eng.push(EngWord);
		this.count += 1;
	}
	this.AddRus = function (RusWord) {
		Rus.push(RusWord);
	}
}

var LWord = new Lingvo;
LWord.AddEng("father");
LWord.AddRus("папа");
LWord.AddEng("he");
LWord.AddRus("он");
LWord.AddEng("bread");
LWord.AddRus("хлеб");

alert (LWord.count);
</script>

Нельзя ли более грамотно получать длину массива Lingvo.count без суммирования?

zebra 03.01.2012 00:00

Eng.length
Rus.length

diagnost 03.01.2012 00:05

Не работает, будет равно нулю. length в объекте, судя по всему, присваивается в самом начале, когда массивам еще не переданы величины после создания объекта:
//this.count = 0;
this.count = Eng.length

//.........
alert (LWord.count);// = 0

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

zebra 03.01.2012 00:10

После вашего кода вызовите
alert(LWord.Eng.length, LWord.Rus.length);

diagnost 03.01.2012 00:15

Так работает, но хотелось бы иметь свойство "второго" порядка, а не "третьего". То-есть не LWord.Eng.length, а LWord.count

zebra 03.01.2012 00:16

Ну так в чём проблема? Создать отдельное свойство которое вернет length? ;)

diagnost 03.01.2012 00:21

Как?
this.count = Eng.length

или
this.count = this.Eng.length

в обоих случаях LWord.count будет равен нулю.

zebra 03.01.2012 00:24

this.count = function() {
    return Eng.length;
};

diagnost 03.01.2012 00:28

Результат отрицательный. В окне после вызова alert (LWord.count) выводится:
function() {
    return Eng.length;
}

zebra 03.01.2012 00:31

Покажите весь код

diagnost 03.01.2012 00:31

<html>
<script>

function Lingvo() {
	var Eng = [];
	var Rus = [];
//	this.count = 0;
	this.Eng = Eng;
	this.Rus = Rus;
	this.AddEng = function (EngWord) {
		Eng.push(EngWord);
//		this.count += 1;
	}
	this.AddRus = function (RusWord) {
		Rus.push(RusWord);
	}
	this.count = function() {
    return Eng.length;
};
}

var LWord = new Lingvo;
LWord.AddEng("father");
LWord.AddRus("папа");
LWord.AddEng("he");
LWord.AddRus("он");
LWord.AddEng("bread");
LWord.AddRus("хлеб");

alert (LWord.count);
</script>
</html>

zebra 03.01.2012 00:37

Читайте книги, count в данном коде это же метод

diagnost 03.01.2012 00:40

Это понятно - и про метод, и про полезность книг. Существует ли возможность получить LWord.count в качестве величины?

zebra 03.01.2012 00:45

1-й метод чем не устраивает?

diagnost 03.01.2012 00:50

Много слов в БД, не хотелось бы все время складывать. Хотя понятно, что на быстродействие это не сильно повлияет, но как-то некрасиво выглядит. Хочется элегантности.

рони 03.01.2012 01:00

Вариант ...
var Lingvo = function () {
        return {
            Eng: [],
            Rus: [],
            count: 0,
            AddEng: function (EngWord) {
                this.count = this.Eng.push(EngWord);

            },
            AddRus: function (RusWord) {
                this.Rus.push(RusWord);
            }
        }
    }

var LWord = Lingvo();
LWord.AddEng("father");
LWord.AddRus("папа");
LWord.AddEng("he");
LWord.AddRus("он");
LWord.AddEng("bread");
LWord.AddRus("хлеб");

alert (LWord.count);

diagnost 03.01.2012 01:06

Вариант элегантней исходного. Если это предел возможного, остановлюсь на этом, хотя все еще присутствует неоднократное вычисление count. Спасибо.

Livaanderiamarum 03.01.2012 09:19

Цитата:

Сообщение от diagnost (Сообщение 147772)
Вариант элегантней исходного. Если это предел возможного, остановлюсь на этом, хотя все еще присутствует неоднократное вычисление count. Спасибо.

твой лучше был

Aetae 03.01.2012 09:53

Вообще два отдельных массива для того что вы делаете явно очень плохо.
Стоит один раз ошибиться - и всё, писец пришёл.

diagnost 03.01.2012 11:29

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

Если внимательно посмотреть на стандартный алгоритм заполнения двумерного массива, то можно увидеть, что new Array объявляется столько раз, сколько строк. Получается, например, что для десяти строк это будет десять массивов, а не два, как в моем случае. А если строк будет 1000?
Это сказывается на памяти и быстродействии.
Насчет борьбы с ошибками - есть смысл повторять подсчет count во втором массиве и контролировать нулевую разницу.

Aetae 03.01.2012 12:49

Цитата:

Сообщение от diagnost (Сообщение 147805)
Это сказывается на памяти и быстродействии.

Крайне несущественно.

Цитата:

Сообщение от diagnost (Сообщение 147805)
Все дело в многомерных массивах. Объявить многомерный массив один раз, а потом добавлять в него элементы у меня не получилось, как я ни старался.

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

var Lingvo = function () {
        return {
            Eng: [],
            count: 0,
            Add: function (EngWord,RusWord) {
                this.count = this.Eng.push(EngWord,RusWord)/2;
            }
        }
    }

var LWord = Lingvo();
LWord.Add("father","папа");
LWord.Add("he","он");
LWord.Add("bread","хлеб");

alert (LWord.count);

Livaanderiamarum 03.01.2012 15:11

что должно лежать в Lingvo.count, длинна всех массивов, или длинна русского массива?

diagnost 03.01.2012 18:16

длины русского и английского массивов одинаковы. count хранит длину любого из них. На данный момент вот такой вариант:
<script>
function Lingvo() {
	this.count = 0;
	this.Eng = [];
	this.Rus = [];
	this.Add = function (EngWord, RusWord) {
			this.Eng.push(EngWord);
			this.Rus.push(RusWord);
			this.count =+ 1;
	}
}

var LWord = new Lingvo;

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");

alert (LWord.count);
alert (LWord.Eng[1]);
alert (LWord.Rus[1]);
</script>


Так можно как-нибудь уйти от суммирования или возврата из push? Найти count за один раз? Или это невозможно?

Livaanderiamarum 03.01.2012 18:37

Я ОДИН ТУТ ВООБЩЕ НЕ ПОНИМАЮ В ЧЕМ ЕГО ПРОБЛЕМА?

Livaanderiamarum 03.01.2012 18:40

Я ВООБЩЕ НЕ ПОНИМАЮ О ЧЕМ ТУТ МОЖНО ГОВОРИТЬ !!! О____________________О

function Lingvo() {
	this.Eng = [];
	this.Rus = [];
	this.Add = function (EngWord, RusWord) {
			this.Eng.push(EngWord); //суешь туда
			this.Rus.push(RusWord); //суешь сюда
			//кладешь в свойство count  ссылку на длину одного из массивов создаваемого объекта.
			this.count = this.Eng.length;
	}
}

var LWord = new Lingvo;

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");

alert (LWord.count);
alert (LWord.Eng[1]);
alert (LWord.Rus[1]);


каждый раз ссылку нужно перезасовывать потому что метод push переписывает свойство this.count тупо числом!! Можно заменить метод push другим чтобы не переписывал числом, надо?

diagnost 03.01.2012 18:53

Тут главное выражение: "каждый раз". Я с первого поста спрашивал, как сделать так, чтобы не было "каждый раз", а был только один раз в момент вызова LWord.count

Livaanderiamarum 03.01.2012 19:00

Цитата:

Сообщение от diagnost (Сообщение 147853)
Тут главное выражение: "каждый раз". Я с первого поста спрашивал, как сделать так, чтобы не было "каждый раз", а был только один раз в момент вызова LWord.count

ты знаешь как метод push работает? что он КАЖДЫЙ РАЗ засовывает элемент в конец массива, КАЖЫДЙ Раз измеряет длинну и перезаписывает её. КАЖДЫЙ РАЗ. мало того ты используешь этот метод 2 раза за добавление!!!!!

Livaanderiamarum 03.01.2012 19:03

function Lingvo() {
	this.count = 0;
	this.Eng = [];
	this.Rus = [];
	this.Add = function (EngWord, RusWord) {
			this.Eng[this.count] = EngWord; //суешь туда
			this.Rus[this.count] = RusWord; //суешь сюда
			this.count ++;//прибавляешь длинну
	}
}

var LWord = new Lingvo;

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");

alert (LWord.count);
alert (LWord.Eng[1]);
alert (LWord.Rus[1]);


теперь за место 3 операций происходит одна. прибавление длинны при добавлении слова с переводом.
спасибо - пожалуйста

diagnost 03.01.2012 19:08

Дело не в push, это промежуточный вариант скрипта. Потом все перепишется и я постараюсь целиком сразу получить массив из БД.
Дело в теории вопроса. Можно ли или нет получить count за один раз. Да или нет. Если да, то как? За улучшение спасибо.

Livaanderiamarum 03.01.2012 19:10

Цитата:

Сообщение от diagnost
Дело в теории вопроса. Можно ли или нет получить count за один раз.

НЕТ! каунт нельзя получить один раз и на всегда потому что он каждый раз изменяется с добавлением новых слов. Ответил на вопрос?

diagnost 03.01.2012 19:32

Не совсем. Можно ли каунт получить один раз и навсегда после добавления всех новых слов?

рони 03.01.2012 19:40

Цитата:

Сообщение от diagnost
Я с первого поста спрашивал, как сделать так, чтобы не было "каждый раз", а был только один раз в момент вызова LWord.count

,
А чем вам не подошёл вариант предложенный в первых постах ?
function Lingvo() {
	this.Eng = [];
	this.Rus = [];
	this.Add = function (EngWord, RusWord) {
			this.Eng.push(EngWord); 
			this.Rus.push(RusWord); 			.

	};
    this.count = function ()
{
  return  this.Eng.length;
}
}

var LWord = new Lingvo;

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");

alert (LWord.count());
alert (LWord.Eng[1]);
alert (LWord.Rus[1]);

Livaanderiamarum 03.01.2012 19:41

можно но тогда тебе нужно добавлять методами ПУШ и потом как надобавляешь, то есть после

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");


сделать следущее

LWord.count = LWord.Eng.length

и в каунте у тя будет лежать длинна.. пипец неужели это так сложно)))?

но такой способ медленнее которого я дал потмоу что тут действий больше а в моем одно)))

Livaanderiamarum 03.01.2012 19:43

Ну вот, самый лучший вариант


function Lingvo() {
	this.count = 0;
	this.Eng = [];
	this.Rus = [];
	this.Add = function (EngWord, RusWord) {
			this.Eng[this.count] = EngWord; //суешь туда
			this.Rus[this.count] = RusWord; //суешь сюда
			this.count ++;//прибавляешь длинну
	}
}

var LWord = new Lingvo;

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");

alert (LWord.count);
alert (LWord.Eng[1]);
alert (LWord.Rus[1]);

zebra 03.01.2012 19:53

Проблема высосана из пальца :-?

Livaanderiamarum 03.01.2012 19:57

Цитата:

Сообщение от zebra (Сообщение 147871)
Проблема высосана из пальца :-?

Проблема начинается от непонимания устройства систем языка)

diagnost 03.01.2012 20:32

Цитата:

Сообщение от Livaanderiamarum (Сообщение 147868)
можно но тогда тебе нужно добавлять методами ПУШ и потом как надобавляешь, то есть после

LWord.Add("father", "папа");
LWord.Add("he", "он");
LWord.Add("bread", "хлеб");
LWord.Add("I", "я");


сделать следущее

LWord.count = LWord.Eng.length

и в каунте у тя будет лежать длинна.. пипец неужели это так сложно)))?

но такой способ медленнее которого я дал потмоу что тут действий больше а в моем одно)))

Я могу так получить длину, уже писалось об этом на предыдущих страницах несколько раз. Вопрос стоял другой. Можно ли написать объект, содержащий массив, чтобы длину массива можно было бы прочесть в count через вызов LWord.count без суммирования за один раз. Способ "внешнего" присвоения значения count, как посоветовали в этом сообщении, неприемлем по очевидным причинам - метод получения count должен находиться внутри объекта, а не через "внешние" операции с объектом. ООП предполагает именно такой подход.
Пока никто так на этот простой вопрос не дал ответа.

Kolyaj 03.01.2012 20:37

Сделайте count функцией. В чём проблема-то?

diagnost 03.01.2012 20:39

Расшифрую. ИМХО, count правильно получать в Lingvo, а не в LWord и за один раз, а не постоянно суммируя.

diagnost 03.01.2012 20:39

Kolyaj, вот не получается у меня. Может, у Вас получится? Попробуйте.


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