JS ассоциативный объект с повторяющимися именами - PullRequest
2 голосов
/ 22 октября 2010

хорошо, поэтому у меня есть такой объект:

var myobject = {
   "field_1": "lorem ipsum",
   "field_2": 1,
   "field_2": 2,
   "field_2": 6
};

как видите, в объекте есть повторяющиеся имена, но с разными значениями. Если я прохожу через это как (используя jQuery):

$.each(myobject, function(key, value)
{
   console.log(key);
   console.log(myobject[key]);
   console.log(myobject[value]);
}

key - returns the correct key
myobject[key] - returns the name for that key
myobject[value] - returns the last elements', with that name, value

означает, что для field_2 он вернет 6, хотя он напечатает его 3 раза, так как он повторяется 3 раза в объекте.

Мой вопрос заключается в том, как получить правильное значение для этого дублированного именованного поля, а не только для последнего 100 *

Спасибо

Ответы [ 8 ]

6 голосов
/ 22 октября 2010

Это не массив, который является объектом.Лучше создать свойство объекта, являющегося массивом, и сохранить в нем различные значения.

var myarray = {
   "field_1": "lorem ipsum",
   "field_array": []
};

myarray.field_array.push(value);

, а затем просто пройтись по этому свойству массива.

2 голосов
/ 22 октября 2010
  1. Ваш код имеет неверный синтаксис.
  2. В Javascript нет ассоциативных массивов
  3. То, что вы определили, является объектом
  4. Если вы присвоите свойству значение 3 раза, убедитесь, что оно содержит последнее значение

Тест

var obj = {
   "field_1": "lorem ipsum",
   "field_2": 1,
   "field_2": 2,
   "field_2": 6
};

for ( var i in obj ) {
  console.log(i + " = " + obj[i]);
}

OUTPUT

field_1 = lorem ipsum
field_2 = 6
1 голос
/ 22 октября 2010

Вы не можете сделать это. Ключ массива должен быть уникальным.

Если у вас установлен Firefox / Firebug (или аналогичный в другом браузере), вы можете попробовать его, введя это в консоль Firebug:

var myarray = {
   "field_1": "lorem ipsum",
   "field_2": 1,
   "field_2": 2,
   "field_2": 6
};
console.dir(myarray);

Firebug ответит:

field_1      "lorum ipsum"
field_2      6

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

Самое близкое, что вы можете получить к тому, что вы хотите, это сделать field_2 массивом в себе, что-то вроде этого:

var myarray = {
   "field_1": "lorem ipsum",
   "field_2": [1,2,6]
};

Если вы сделаете console.log сейчас, вы получите это:

field_1      "lorum ipsum"
field_2
    0        1
    1        2
    2        6

Надеюсь, это поможет.

1 голос
/ 22 октября 2010

Ключи должны быть уникальными.

0 голосов
/ 22 октября 2010

Ассоциативных массивов в Javascript не существует - вы создали Объект, использующий формат JSON.

Я подозреваю, что что-то подобное даст вам больше того, что вы ищете, хотя я предлагаю задаться вопросом, что именноэто то, что вы пытаетесь достичь ..

Следующий код позволит вам получить доступ к нескольким экземплярам дублированных «ключей», но это

var myDataset = [
   { "field_1": "lorem ipsum" },
   { "field_2": 1 },
   { "field_2": 2 },
   { "field_2": 6 }
];


$.each(myDataset, function(valuePairIndex, value)
{
    $.each(myDataset[valuePairIndex], function(key, value1)
    {
       var valuePair = myDataset[valuePairIndex];
       console.log(valuePairIndex);
       console.log(key + ' = ' + valuePair[key]);

//       console.log('key = ' + key);
//       console.log('valuePair[key] = ' + valuePair[key]);
    });
});
0 голосов
/ 22 октября 2010

Это невозможно.

Полученный объект содержит только 2 элемента, первый и второй элементы field_2 теряются при создании.

0 голосов
/ 22 октября 2010

Вы перезаписываете одно и то же значение несколько раз.

Вероятно, вам нужно что-то вроде:

var myarray = {
   "field_1": "lorem ipsum",
   "field_2": [1,2,6]
};

То, что может быть написано так, как у вас сейчас:

var myarray = {};

myarray.field_1 = [];
myarray.field_1.push('lorem ipsum');
myarray.field_2 = [];
myarray.field_2.push(1);
myarray.field_2.push(2);
myarray.field_2.push(6);

Обратите внимание, что я также сделал массив field_1, что - для согласованности - я подумал, что вы, возможно, захотите.

0 голосов
/ 22 октября 2010

Единственный способ обойти это - изменить поля на уникальные идентификаторы или что-то вроде:

var myarray = {
   "field_1": "lorem ipsum",
   "field_2": [
       {"value_1": 1},
       {"value_2": 2},
       {"value_3": 6}
   ]
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...