Длина массива в объекте
Имеется скрипт:
<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 без суммирования? |
Eng.length Rus.length |
Не работает, будет равно нулю. length в объекте, судя по всему, присваивается в самом начале, когда массивам еще не переданы величины после создания объекта:
//this.count = 0; this.count = Eng.length //......... alert (LWord.count);// = 0 Вот потому и спрашиваю. length хотелось бы получить однократно без постоянного суммирования, может быть через вызов функции, но как - не соображу. |
После вашего кода вызовите
alert(LWord.Eng.length, LWord.Rus.length); |
Так работает, но хотелось бы иметь свойство "второго" порядка, а не "третьего". То-есть не LWord.Eng.length, а LWord.count
|
Ну так в чём проблема? Создать отдельное свойство которое вернет length? ;)
|
Как?
this.count = Eng.length или this.count = this.Eng.length в обоих случаях LWord.count будет равен нулю. |
this.count = function() {
return Eng.length;
};
|
Результат отрицательный. В окне после вызова alert (LWord.count) выводится:
function() {
return Eng.length;
}
|
Покажите весь код
|
<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>
|
Читайте книги, count в данном коде это же метод
|
Это понятно - и про метод, и про полезность книг. Существует ли возможность получить LWord.count в качестве величины?
|
1-й метод чем не устраивает?
|
Много слов в БД, не хотелось бы все время складывать. Хотя понятно, что на быстродействие это не сильно повлияет, но как-то некрасиво выглядит. Хочется элегантности.
|
Вариант ...
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);
|
Вариант элегантней исходного. Если это предел возможного, остановлюсь на этом, хотя все еще присутствует неоднократное вычисление count. Спасибо.
|
Цитата:
|
Вообще два отдельных массива для того что вы делаете явно очень плохо.
Стоит один раз ошибиться - и всё, писец пришёл. |
Все дело в многомерных массивах. Объявить многомерный массив один раз, а потом добавлять в него элементы у меня не получилось, как я ни старался.
Если внимательно посмотреть на стандартный алгоритм заполнения двумерного массива, то можно увидеть, что new Array объявляется столько раз, сколько строк. Получается, например, что для десяти строк это будет десять массивов, а не два, как в моем случае. А если строк будет 1000? Это сказывается на памяти и быстродействии. Насчет борьбы с ошибками - есть смысл повторять подсчет count во втором массиве и контролировать нулевую разницу. |
Цитата:
Цитата:
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);
|
что должно лежать в Lingvo.count, длинна всех массивов, или длинна русского массива?
|
длины русского и английского массивов одинаковы. 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 за один раз? Или это невозможно? |
Я ОДИН ТУТ ВООБЩЕ НЕ ПОНИМАЮ В ЧЕМ ЕГО ПРОБЛЕМА?
|
Я ВООБЩЕ НЕ ПОНИМАЮ О ЧЕМ ТУТ МОЖНО ГОВОРИТЬ !!! О____________________О
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 другим чтобы не переписывал числом, надо? |
Тут главное выражение: "каждый раз". Я с первого поста спрашивал, как сделать так, чтобы не было "каждый раз", а был только один раз в момент вызова LWord.count
|
Цитата:
|
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 операций происходит одна. прибавление длинны при добавлении слова с переводом. спасибо - пожалуйста |
Дело не в push, это промежуточный вариант скрипта. Потом все перепишется и я постараюсь целиком сразу получить массив из БД.
Дело в теории вопроса. Можно ли или нет получить 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]);
|
можно но тогда тебе нужно добавлять методами ПУШ и потом как надобавляешь, то есть после
LWord.Add("father", "папа"); LWord.Add("he", "он"); LWord.Add("bread", "хлеб"); LWord.Add("I", "я"); сделать следущее LWord.count = LWord.Eng.length и в каунте у тя будет лежать длинна.. пипец неужели это так сложно)))? но такой способ медленнее которого я дал потмоу что тут действий больше а в моем одно))) |
Ну вот, самый лучший вариант
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]);
|
Проблема высосана из пальца :-?
|
Цитата:
|
Цитата:
Пока никто так на этот простой вопрос не дал ответа. |
Сделайте count функцией. В чём проблема-то?
|
Расшифрую. ИМХО, count правильно получать в Lingvo, а не в LWord и за один раз, а не постоянно суммируя.
|
Kolyaj, вот не получается у меня. Может, у Вас получится? Попробуйте.
|
| Часовой пояс GMT +3, время: 18:57. |