Доступ к элементу массива.
Привет
Есть массив prices =[ {name: 'Bed', price: 900}, {name: 'Table', price: 400} ] Как мне достучаться до переменной, например получить price Стола (Table)? Я конечно могу обратиться prices[1].price Но это не читаемо. В идеале хотелось бы обратиться prices.table.price Что-то вроде ассоциативного массива. Наверное как-то по другому надо. Поделитесь лучшей практикой. |
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); |
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) |
Все понял. Надо писать функцию :)) Думал есть что-то встроенное в JS. Спасибо!
|
Цитата:
Так как данные будут подгружаться из базы данных. Я не могу точно знать что у меня будет, кровать или стулья )) |
Цитата:
|
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 |
Цитата:
|
Цитата:
|
danik.js, понятное дело, что искать объект по свойству как-то тупо и не логично. :)
|
Я вобще-то о модификации прототипа. Оказывается еще не все знают...
Ну и про логику конечно верно сказано. Думаю тс главно чтоб хоть как-то работало, на логику он клал ) |
Пришел к такому решению
function getPrice(name) { prices.forEach(function (el) { if (el.name == name) { return el.price; } else { return null } }); } |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
price['тумбочка'] - может jtjt1010 не знает про такой вариант доступа к свойству?
|
Цитата:
Ладно глумиться. У вас статусы "Профессор". А я новичок.. Помогите. |
Подсказали уже.
function getPrice(name) { price = null; prices.forEach(function (el) { if (el.name == name) { price = el.price; return; } else { return; } }); return price; } |
Цитата:
|
Цитата:
И организовывать данные по типу price = {тумбочка: 100, табуретка: 50}; color = {тумбочка: 'Коричневая', табуретка: 'Черная'}; desc = {тумбочка: 'Прикроватная', табуретка: 'Кухонная'}; Как-то не удобно. Гораздо удобней так: prices = [{ id: 77, name: 'тумбочка', desc: 'Прикроватная', color: 'Черная', price: 900 }, { id: 78, name: 'Табуретка', desc: 'Кухонная', color:'Коричневая', price: 400 }]; Поэтому мне надо организовать удобный доступ к этому массиву. Понятно что выбирать я буду по id. Пример c name был приведен сходу, для примера. |
Цитата:
php $r=$link->query($q); $res=$r->fetch_assoc(); // тут православные заголовки echo json_encode($res); js/ajax var row = JSON.parse(link.responsetext); Юзайте. Получится именно как в последнем примере. В запросе регулируйте количество полей, конкатенацию, типы и все такое. |
Православные заголовки
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'); |
Цитата:
Вот это - другое дело: var products = { 'тумбочка': { id: 77, desc: 'Прикроватная', color: 'Черная', price: 900 }, 'табуретка': { id: 78, desc: 'Кухонная', color:'Коричневая', price: 400 } }; alert(products['тумбочка'].price); alert(products['табуретка'].color); |
Продукт идентифиуируется по id однозначно. Тумбочек может быть стопицот разных форм и размеров и цен.
То же самое, но кошерно: Код:
$r=$link->query($q); // то есть какой-то запрос, в котором id непременно первой колонкой var prod = products[elem.id.replace('id','')].price; |
Более того, грузить заранее может и не надо ничего кроме этих id. По ним как два пальца загрузить обширную строку со всем барахлом и тут же ее вставить куда надо.
Тфу блин, а же и рассуждал в парадигме аякса со всеми этими заголовками. |
Есть еще табличная структура, например $_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,
а лаконично по делу и без жаргона слабо? |
А вообще заработоло вот так. JsFiddle подсказал убрать квадратные скобки.
var products = { 'тумбочка': { id: 77, desc: 'Прикроватная', color: 'Черная', price: 900 }, 'табуретка': { id: 78, desc: 'Кухонная', color:'Коричневая', price: 400 } }; alert(products.тумбочка.price); alert(products.табуретка.color); |
jtjt1010, кириллицу лучше в квадратные обернуть.
|
Цитата:
|
Это не мешает. Мешает жаргон вопрошантов. Одному одинаковые элементы надо найти, другому добраться до элемента массива который еще в проекте. Вот это я понимаю - жаргон, который ведет к лаконизму на 4 страницы.
|
Часовой пояс GMT +3, время: 12:30. |