Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Доступ к элементу массива. (https://javascript.ru/forum/misc/45240-dostup-k-ehlementu-massiva.html)

jtjt1010 20.02.2014 11:48

Доступ к элементу массива.
 
Привет

Есть массив
prices =[ 
        {name: 'Bed', price: 900},
        {name: 'Table', price: 400}    
    ]


Как мне достучаться до переменной, например получить price Стола (Table)?

Я конечно могу обратиться prices[1].price Но это не читаемо. В идеале хотелось бы обратиться prices.table.price

Что-то вроде ассоциативного массива. Наверное как-то по другому надо. Поделитесь лучшей практикой.

ruslan_mart 20.02.2014 11:59

var prices = [ 
        {name: 'Bed', price: 900},
        {name: 'Table', price: 400}    
], _prices = {};

prices.forEach(function(el) {
   _prices[el.name] = el;
});

prices = _prices;

alert( prices.Table.price );


var prices = {
   bed: 900,
   table: 200
};

alert(prices.table);

рони 20.02.2014 12:02

jtjt1010,
:-?
var prices = [{
    name: 'Bed',
    price: 900
}, {
    name: 'Table',
    price: 400
}]
for (var i = 0; i < prices.length; i++) {
    if (prices[i].name == 'Table') alert(prices[i].price)
}
for (var i = 0; i < prices.length; i++) {
    prices[prices[i].name] = {};
    prices[prices[i].name]['price'] = prices[i].price
}
alert(prices.Table.price)

jtjt1010 20.02.2014 12:07

Все понял. Надо писать функцию :)) Думал есть что-то встроенное в JS. Спасибо!

jtjt1010 20.02.2014 12:13

Цитата:

Сообщение от Ruslan_xDD

var prices = {

   bed: 900,

   table: 200

};

alert(prices.table);

Это первое что пришло на ум. Но хотелось бы еще иметь доступ к name.
Так как данные будут подгружаться из базы данных. Я не могу точно знать что у меня будет, кровать или стулья ))

danik.js 20.02.2014 12:17

Цитата:

Сообщение от jtjt1010
Я не могу точно знать что у меня будет, кровать или стулья ))

И как это мешает использовать более удобный и шустрый, предложенный тут вариант?

ruslan_mart 20.02.2014 12:22

Array.prototype.getObjectByName = function(name) {
	var i, len = this.length, self;
	for(i = 0; i < len; i++) {
		self = this[i];
		if(typeof self == 'object' && self.name == name) return self;
	}
};
      
var prices = [{name: 'table', price: 200}];
      
alert( prices.getObjectByName('table').price );


:p

jtjt1010 20.02.2014 12:30

Цитата:

Сообщение от Ruslan_xDD
:p

Круто! Но пока для меня сложно.

danik.js 20.02.2014 12:49

Цитата:

Сообщение от jtjt1010
Круто!

Ага. И еще порицательно! Профессионалы так никогда не делают.

ruslan_mart 20.02.2014 12:59

danik.js, понятное дело, что искать объект по свойству как-то тупо и не логично. :)

danik.js 20.02.2014 13:08

Я вобще-то о модификации прототипа. Оказывается еще не все знают...
Ну и про логику конечно верно сказано. Думаю тс главно чтоб хоть как-то работало, на логику он клал )

jtjt1010 20.02.2014 13:44

Пришел к такому решению

function getPrice(name) {
    prices.forEach(function (el) {
        if (el.name == name) {
            return el.price;
        } else {
            return null
        }
    });
}

jtjt1010 20.02.2014 13:49

Цитата:

Сообщение от danik.js
на логику он клал )

С чего вы решили, что я брезгую логики? Я хочу из базы получить массив товар, цена. А потом получать данные из массива. Я бы с удовольствием использовал просто price = { тумбочка: 100, табуретка: 50}, а потом вызывал price.тумбочка. Но как мне получить значение указателя тогда?

ruslan_mart 20.02.2014 13:54

Цитата:

Сообщение от danik.js
Я вобще-то о модификации прототипа.

Ну ТС главное, чтобы работало же. :D

рони 20.02.2014 14:06

Цитата:

Сообщение от jtjt1010
а потом вызывал price.тумбочка. Но как мне получить значение указателя тогда?

немного не врубаюсь а тут-то price.тумбочка вы откуда тумбочку взяли?

danik.js 20.02.2014 15:13

Цитата:

Сообщение от jtjt1010
Но как мне получить значение указателя тогда?

Я вот тоже не понимаю о чем говорит jtjt1010.. Ты можешь поднапрячься и объяснить что у тебя не получается?
Цитата:

Сообщение от jtjt1010
Пришел к такому решению

А тебя не смущает что оно не работает? :D Так как функция getPrice() не возвращает никакого значения ))

danik.js 20.02.2014 15:18

price['тумбочка'] - может jtjt1010 не знает про такой вариант доступа к свойству?

jtjt1010 20.02.2014 15:38

Цитата:

Сообщение от danik.js
А тебя не смущает что оно не работает? Так как функция getPrice() не возвращает никакого значения ))

Дейсвительно не работает. Я выводил в консоль. А ничего не возвращается. Абидно.

Ладно глумиться. У вас статусы "Профессор". А я новичок..

Помогите.

jtjt1010 20.02.2014 15:42

Подсказали уже.
function getPrice(name) {
    price = null;
    prices.forEach(function (el) {
        if (el.name == name) {
            price = el.price;
            return;
        } else {
            return; 
        }
    });
    return price;
}

рони 20.02.2014 15:44

Цитата:

Сообщение от jtjt1010
price = { тумбочка: 100, табуретка: 50},

так чем вас неустроил этот вариант? или тайна сия велика есть

jtjt1010 20.02.2014 16:03

Цитата:

Сообщение от рони
так чем вас неустроил этот вариант? или тайна сия велика есть

У тумбочки помимо цены есть еще и описание и цвет и т.д.
И организовывать данные по типу
price =  {тумбочка: 100, табуретка: 50};
color = {тумбочка: 'Коричневая', табуретка: 'Черная'};
desc = {тумбочка: 'Прикроватная', табуретка: 'Кухонная'};

Как-то не удобно.



Гораздо удобней так:
prices = [{
        id: 77,
        name: 'тумбочка',
        desc: 'Прикроватная',
        color: 'Черная',
        price: 900
    }, 
    {  id: 78,
        name: 'Табуретка',
        desc: 'Кухонная',
        color:'Коричневая',
        price: 400
    }];


Поэтому мне надо организовать удобный доступ к этому массиву. Понятно что выбирать я буду по id. Пример c name был приведен сходу, для примера.

kostyanet 20.02.2014 16:12

Цитата:

Сообщение от jtjt1010
price = {тумбочка: 100, табуретка: 50};
color = {тумбочка: 'Коричневая', табуретка: 'Черная'};
desc = {тумбочка: 'Прикроватная', табуретка: 'Кухонная'};

Если вы сами формируете ответ сервера то на кой что-то городить? Есть же json.

php

$r=$link->query($q);
$res=$r->fetch_assoc();
// тут православные заголовки
echo json_encode($res);

js/ajax

var row = JSON.parse(link.responsetext);

Юзайте. Получится именно как в последнем примере. В запросе регулируйте количество полей, конкатенацию, типы и все такое.

kostyanet 20.02.2014 16:14

Православные заголовки

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json; charset=utf-8');

danik.js 20.02.2014 16:14

Цитата:

Сообщение от jtjt1010
Гораздо удобней так:

А чем удобней-то?
Вот это - другое дело:
var products = {
    'тумбочка': {
        id: 77,
        desc: 'Прикроватная',
        color: 'Черная',
        price: 900
    },
    'табуретка': {
        id: 78,
        desc: 'Кухонная',
        color:'Коричневая',
        price: 400
    }
};
alert(products['тумбочка'].price);
alert(products['табуретка'].color);

kostyanet 20.02.2014 16:43

Продукт идентифиуируется по id однозначно. Тумбочек может быть стопицот разных форм и размеров и цен.

То же самое, но кошерно:

Код:

$r=$link->query($q); // то есть какой-то запрос, в котором id непременно первой колонкой
$res=array();
while($arr=$r->fetch_assoc())
  $res[$arr['id']]=array_slice($arr, 1);

// получится примерно так

$res = array(
  78=>array(color=>red, price=>987);
  67=>array(color=>green, price=>780);
);

После жисона соответственно это объект где в каждой проперти по id лежит объект

var prod = products[elem.id.replace('id','')].price;

kostyanet 20.02.2014 16:48

Более того, грузить заранее может и не надо ничего кроме этих id. По ним как два пальца загрузить обширную строку со всем барахлом и тут же ее вставить куда надо.

Тфу блин, а же и рассуждал в парадигме аякса со всеми этими заголовками.

kostyanet 20.02.2014 16:58

Есть еще табличная структура, например $_FILES в нее компилятся.

var prods = {

id:[78, 35, 43],
color:['green', 'red', 'orange'],
price:[123, 456, 789]

};

Что дает? Например products.color это готовый список для select option. Если так хранится заказ то product.price - это готовый список для суммирования total'а

Адресация идеальна в циклах, директом - жопа.

index = products.id.indexOf(78);
color= products.color[index];

Можно дополнительно проиндексировать. У меня так и сделано, кстати, но на php.

Что дает? А например я получаю любую колонку по ее номеру через аякс с того же самого опупенного запроса, из которого запросы на все остальные колонки (идентификаторы) просто выкидываются, а табличная структура позволяет отгрузить результат той же продуктовой модели прямо в браузер. Кроме того трансформация (рендер) данных по колонкам гораздо эффективнее чем по строкам. Потому что на каждую колонку требуется отдельные, нередко изрядные опции. Например есть адрес сайт/tables/?p=1... туева хуча фильтров может быть, и буква j означает - идтикаты на аякс. значение j=3 означает выдай-ка всю четвертую колонку, только одну. Чпок и выдали. Юзер чпок и получил подсказку какие вообще в этой колонке могу быть уникальные значения. Потому что у него 15 страниц скажем.

kostyanet 20.02.2014 17:10

Да, тут я подумал прототипирование бы пригодилось. Табличную структуру засунуть в геттер и будет лепота.

jtjt1010 20.02.2014 17:31

Цитата:

Сообщение от danik.js
Вот это - другое дело:

Вот за это спасибо! То что надо.

рони 20.02.2014 17:35

kostyanet,
а лаконично по делу и без жаргона слабо?

jtjt1010 20.02.2014 18:05

А вообще заработоло вот так. JsFiddle подсказал убрать квадратные скобки.
var products = {
    'тумбочка': {
        id: 77,
        desc: 'Прикроватная',
        color: 'Черная',
        price: 900
    },
    'табуретка': {
        id: 78,
        desc: 'Кухонная',
        color:'Коричневая',
        price: 400
    }
};
alert(products.тумбочка.price);
alert(products.табуретка.color);

ruslan_mart 21.02.2014 06:20

jtjt1010, кириллицу лучше в квадратные обернуть.

danik.js 21.02.2014 06:28

Цитата:

Сообщение от Ruslan_xDD
кириллицу лучше в квадратные обернуть

Почему?

kostyanet 21.02.2014 09:51

Это не мешает. Мешает жаргон вопрошантов. Одному одинаковые элементы надо найти, другому добраться до элемента массива который еще в проекте. Вот это я понимаю - жаргон, который ведет к лаконизму на 4 страницы.


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