Доступ до нечислових властивостей об’єкта за допомогою індексу?


88

Якщо у мене є такий масив:

var arr = ['one','two','three'];

Я можу отримати доступ до різних частин, виконавши це:

console.log(arr[1]);

Як я можу отримати доступ до властивостей об’єкта за їх порядком, а не за ключем?

Приклад:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Як би я отримав першу властивість для кожного об'єкта - "щось" від objі "ще більше" від - jboбез явного використання властивості?

Зараз, здається, деякі з вас думають, що я хочу щось подібне:

console.log(obj['something']);

Це не так, я спеціально прагну орієнтуватися на індекс, як і перший приклад - якщо це можливо.


2
Що ви маєте на увазі під "масивом об'єктів". Масив - це об’єкт. Ви маєте на увазі просто об’єкт, який не є масивом, або масив об’єктів. І як jQuery враховує ваше запитання? Ваш єдиний приклад коду ілюструє ту частину, яку ви вже знаєте, як робити. Як щодо того, щоб надати якийсь код, який ілюструє проблему .
user113716

@ Ӫ _.
daryl

4
Насправді я б сказав, що людей, які "знають" jQuery і не знають JavaScript, більше, ніж навпаки (принаймні люди, які знають JavaScript, повинні легко розуміти jQuery) .... і стосовно вашого фактичного питання: не може отримати доступ до властивостей об'єктів за допомогою індексу. Вони не замовляються.
Фелікс Клінг,

2
"... Я вважав, що кожен, хто знає jQuery, повинен розуміти масиви ..." Я б не ставлю на це.
user113716

1
@Brogrammer: це питання не має нічого спільного з jQuery, тому тег jQuery недоречний.
outis

Відповіді:


125

"Я спеціально прагну орієнтуватися на індекс, як і перший приклад - якщо це можливо".

Ні, це неможливо.

Найближче, що ви можете отримати, це отримати масив ключів об’єкта і використовувати це:

var keys = Object.keys( obj );

... але немає гарантії, що ключі будуть повернуті у визначеному вами порядку. Тож це може виглядати так:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()можна використовувати надійно, якщо ви знаєте вміст об’єкта. Більш детально тут: stackoverflow.com/questions/280713 / ...
cronoklee

3
Метод Object.keys () повертає масив власних перелічуваних властивостей даного об'єкта в тому ж порядку, що і цикл for ... in (різниця полягає в тому, що цикл for-in перераховує властивості в ланцюжку прототипів як Ну). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Амр Раґей

6
все можливо
Cas Bloem

48

Єдиний спосіб, як я можу подумати про це, - це створення методу, який надає вам властивість Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Демонстрація: http://jsfiddle.net/UmkVn/

Це можна було б поширити на всі об'єкти, що використовують, Object.prototype;але це зазвичай не рекомендується.

Натомість використовуйте допоміжний засіб функції:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
Це круто і працює як шарм! Чому це не прийнята відповідь? Ви, мабуть, повинні використовувати, return this[Object.keys(this)[n]];щоб зробити його загальним.
кроноклі

3
Привіт з 2016 року, ми, майбутні люди, все ще вважаємо, що це має бути прийнятою відповіддю. Чудове рішення
mhodges

Причиною того, що це не прийнята відповідь, є те, що до es6 порядок Object.keys не гарантується. Отже, незважаючи на те, що цей код працює в декількох движках JS, він не гарантовано працює в усіх. stackoverflow.com/questions/5525795 / ...
ptoinson

13

Ви можете використовувати Object.values()метод, якщо не хочете використовувати Object.keys().

На відміну від Object.keys()методу, який повертає масив власних перелічуваних властивостей даного об'єкта, наприклад:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Роздрукує такий масив:

[ 'a', 'b', 'c' ]

Object.values()Метод повертає масив власного перечислимого майна даного об'єкта в values.

Отже, якщо у вас той самий об’єкт, але замість нього використовуються значення,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Ви отримаєте такий масив:

[ 'somestring', 42, false ]

Отже, якщо ви хотіли отримати доступ до object1.b, але використовуючи замість цього індекс, ви можете використовувати:

Object.values(object1)[1] === 42

Детальніше про цей метод ви можете прочитати тут .


1
Цей метод із запропонованих у цій темі здається найкоротшим та найелегантнішим.
Петро Франко

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

Редагувати:

"Я спеціально прагну орієнтуватися на індекс, як і перший приклад - якщо це можливо".

Насправді ключовим фактором є "індекс". Якщо ви хочете зберегти позицію ключа, вам потрібно створити власний об'єкт для обробки цього.


Я знаю, що ви можете отримати до нього доступ за допомогою ключа, це не те, про що я просив.
daryl

@Brogrammer: ваше запитання неоднозначне, тому цей пост потенційно відповідає на запитання, як написано.
вихід


2

Отримайте масив ключів, поверніть його назад, а потім запустіть цикл

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

Ви можете створити масив, заповнений полями вашого об'єкта, і використовувати індекс масиву та отримувати доступ до властивостей об'єкта через це

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

Я пішов і створив для вас функцію:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
Не могли б ви пояснити, що робиться у вашому підході?
Рахул Бобе

Я додав кілька коментарів до коду, щоб ви могли зрозуміти, що робиться.
StackGeek

0

Якщо ви не впевнені, що Object.keys () збирається повернути вам ключі в правильному порядку, ви можете спробувати цю логіку

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.