2015-11-05 2 views
0

Я просто хотел бы узнать, как получить доступ к значению другого ключа в том же хэше. изнутри хэша. не путем myHash.key2 = myHash.key1 ....; Я имею в виду способ сделать:Назначение значения другого ключа в javascript

var myHash = { 
    key1: 5, 
    key2: key1 * 7, 
    key3: true, 
    key4: (key3)? "yes" : "no" 
}; 

PS: это только упрощенная версия фактического кода на самом деле каждый ключ имеет несколько сложных операций внутри. Значения, а не простые числа или bools.

+2

использовать функции. т.е. для key2 будет 'function() {return myHash.key1 * 7; } ' – r3wt

+0

@ r3wt Это хорошая идея, но это заставит меня использовать() для доступа к значениям этих ключей и не использовать их для доступа к значениям других. Так что если я wana итерации по хешу, это было бы легко. Если я не переключу все на функции. Есть идеи по этому поводу? –

ответ

2

Вы не можете ссылаться на другие ключи объекта в пределах литерального определения. Варианты для установки ключа на основе других ключей или других значения в пределах объекта являются:

  1. Используйте функцию геттера для ключа, который может возвращать значение, основанное на других свойствах.

  2. Используйте регулярную функцию для ключа, который может возвращать значение, основанное на других свойствах.

  3. Назначьте ключ/значение за пределами литерального определения, где вы можете назначить статическое значение на основе других ключей/свойств.

Вот примеры каждого из этих вариантов:

// use getters for properties that can base their values on other properties 
var myHash = { 
    key1: 5, 
    get key2() { return this.key1 * 7; }, 
    key3: true, 
    get key4() { return this.key3 ? "yes" : "no";} 
}; 

console.log(myHash.key2); // 35 

// use regular functions for properties that can base 
// their values on other properties 
var myHash = { 
    key1: 5, 
    key2: function() { return this.key1 * 7; }, 
    key3: true, 
    key4: function() { return this.key3 ? "yes" : "no";} 
}; 

console.log(myHash.key2()); // 35 

// assign static properties outside the literal definition 
// that can base their values on other properties 
var myHash = { 
    key1: 5, 
    key3: true 
}; 
myHash.key2 = myHash.key1 * 7; 
myHash.key4 = myHash.key3 ? "yes" : "no"; 

console.log(myHash.key2); // 35 

Примечание: первые два варианта "вживую". Если вы измените значение myHash.key1, тогда будет изменено значение myHash.key2 или myHash.key2(). Третий вариант является статическим, а значения myHash.key2 не будут соответствовать изменениям в myHash.key1.

+1

@OlaviSau - вы не можете получить доступ к другому ключу в середине буквального определения? Переменная 'myHash' еще не установлена, и' this' также не установлен для объекта. Таким образом, вы не имеете возможности ссылаться на другие ключи объекта из литературного определения. Если вы сделаете это в буквальном определении, вы должны использовать свойства, которые являются функцией (регулярными функциями или геттерами). – jfriend00

+0

Yeaaaah ... только что-то случилось, он работал в консоли в первый раз, когда я пробовал, а затем я проверил один из ваших примеров, а затем я, должно быть, что-то пропустил, я знаю, какую ошибку я сделал сейчас, я попробовал используя это сначала, создав obj, а затем во второй раз, когда он использовал var этого объекта, вы действительно правы. –

+0

Вместо этого захотите использовать 'Object.defineProperties'. – PHPglue

0

Прежде всего вам нужно обратиться к объектам свойств с ключевым словом this. Вместо этого:

var myHash = { 
    key1: 5, 
    key2: 11, 
    key3: true, 
    isKey3true: function(){ 
    var r = this.key3 ? 'yes' : 'no'; 
    return r; 
    } 
} 
myHash.key1 = 100; 
console.log(key2); // key2 not a method 
myHash.key3 = false; 
console.log(myHash.isKey3true()); // method will review key3 value 
+0

'this.key1' в вашем примере будет' undefined', а не ссылкой на начальное значение 5. – Josh

Смежные вопросы