Jak używać zmiennej dla klucza w obiekcie JavaScript?
Dlaczego następujące działania?
<something>.stop().animate(
{ 'top' : 10 }, 10
);
To nie działa:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Aby było jeszcze jaśniej: w tej chwili nie mogę przekazać właściwości CSS do funkcji animate jako zmiennej.
8 answers
{ thetop : 10 }
jest poprawnym obiektem literalnym. Kod utworzy obiekt z właściwością o nazwie thetop
, która ma wartość 10. Oba poniższe są takie same:
obj = { thetop : 10 };
obj = { "thetop" : 10 };
W systemach ES5 i wcześniejszych nie można używać zmiennej jako nazwy właściwości wewnątrz literału obiektu. Jedyną opcją jest wykonanie następujących czynności:
var thetop = "top";
// create the object literal
var aniArgs = {};
// Assign the variable property name with a value of 10
aniArgs[thetop] = 10;
// Pass the resulting object to the animate method
<something>.stop().animate(
aniArgs, 10
);
ES6 definiuje ComputedPropertyName jako część gramatyki dla literałów obiektowych, która pozwala na zapisanie kodu w następujący sposób:
var thetop = "top",
obj = { [thetop]: 10 };
console.log(obj.top); // -> 10
Ty może używać tej nowej składni w najnowszych wersjach każdej przeglądarki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-13 12:12:43
Z ECMAScript 2015 możesz teraz zrobić to bezpośrednio w deklaracji obiektu z notacją w nawiasach:
var obj = {
[key]: value
}
Gdzie {[2] } może być dowolnym wyrażeniem (np. zmienną) zwracającym wartość.
Więc tutaj twój kod będzie wyglądał następująco:
<something>.stop().animate({
[thetop]: 10
}, 10)
Gdzie thetop
zostanie zastąpiona wartością zmiennej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-18 08:14:18
ES5 cytat, który mówi, że nie powinno działać
Spec: http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
Nazwa właściwości:
- IdentifierName
- StringLiteral
- NumericLiteral
[...]
Nazwa właściwości produkcyjnejname: IdentifierName jest oceniana w następujący sposób:
- Zwraca wartość łańcuchową zawierającą ten sam ciąg znaków, co / Align = "left" /
Nazwa właściwości produkcyjnejname: StringLiteral jest oceniana w następujący sposób:
- zwraca SV [String value] StringLiteral.
Nazwa właściwości produkcjyname: NumericLiteral jest oceniana w następujący sposób:
- niech nbr będzie wynikiem utworzenia wartości liczbowej.
- Return ToString(nbr).
Oznacza to, że:
-
{ theTop : 10 }
jest dokładnie taki sam jak{ 'theTop' : 10 }
The
PropertyName
theTop
jestIdentifierName
, więc jest konwertowana na'theTop'
wartość łańcuchową, która jest wartością łańcuchową'theTop'
. -
Nie można zapisywać inicjalizatorów obiektów (literałów) za pomocą kluczy zmiennych.
Jedynymi trzema opcjami są
IdentifierName
(rozszerza się na ciąg znaków),StringLiteral
iNumericLiteral
(również rozszerza się na ciąg znaków).
Zasady zostały zmienione dla ES6: https://stackoverflow.com/a/2274327/895245
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:35
Aby dodać właściwość o "dynamicznej" nazwie do obiektu, użyłem następującej opcji:
var key = 'top';
$('#myElement').animate(
(function(o) { o[key]=10; return o;})({left: 20, width: 100}),
10
);
key
to nazwa nowej nieruchomości.
Obiektem właściwości przekazywanych do animate
będzie {left: 20, width: 100, top: 10}
Jest to po prostu użycie wymaganej notacji []
zgodnie z zaleceniami innych odpowiedzi, ale z mniejszą liczbą linii kodu!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 10:42:26
Dodanie nawiasu kwadratowego wokół zmiennej działa dobrze dla mnie. Try this
var thetop = 'top';
<something>.stop().animate(
{ [thetop] : 10 }, 10
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 09:30:30
Podany kod:
var thetop = 'top';
<something>.stop().animate(
{ thetop : 10 }, 10
);
Tłumaczenie:
var thetop = 'top';
var config = { thetop : 10 }; // config.thetop = 10
<something>.stop().animate(config, 10);
Jak widzisz, deklaracja { thetop : 10 }
nie używa zmiennej thetop
. Zamiast tego tworzy obiekt z kluczem o nazwie thetop
. Jeśli chcesz, aby klucz był wartością zmiennej thetop
, musisz użyć nawiasów kwadratowych wokół thetop
:
var thetop = 'top';
var config = { [thetop] : 10 }; // config.top = 10
<something>.stop().animate(config, 10);
Składnia nawiasu kwadratowego została wprowadzona w ES6. We wcześniejszych wersjach JavaScript, należy wykonać następujące czynności:
var thetop = 'top';
var config = (
obj = {},
obj['' + thetop] = 10,
obj
); // config.top = 10
<something>.stop().animate(config, 10);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 18:29:06
W ten sposób można również osiągnąć pożądany wynik
var jsonobj={};
var count=0;
$(document).on('click','#btnadd', function() {
jsonobj[count]=new Array({ "1" : $("#txtone").val()},{ "2" : $("#txttwo").val()});
count++;
console.clear();
console.log(jsonobj);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>value 1</span><input id="txtone" type="text"/>
<span>value 2</span><input id="txttwo" type="text"/>
<button id="btnadd">Add</button>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 10:03:42
Implementacja ES5 do przypisywania kluczy znajduje się poniżej:
var obj = Object.create(null),
objArgs = (
(objArgs = {}),
(objArgs.someKey = {
value: 'someValue'
}), objArgs);
Object.defineProperties(obj, objArgs);
Załączyłem fragment, którego użyłem do konwersji na gołe obiekty.
var obj = {
'key1': 'value1',
'key2': 'value2',
'key3': [
'value3',
'value4',
],
'key4': {
'key5': 'value5'
}
}
var bareObj = function(obj) {
var objArgs,
bareObj = Object.create(null);
Object.entries(obj).forEach(function([key, value]) {
var objArgs = (
(objArgs = {}),
(objArgs[key] = {
value: value
}), objArgs);
Object.defineProperties(bareObj, objArgs);
});
return {
input: obj,
output: bareObj
};
}(obj);
if (!Object.entries) {
Object.entries = function(obj){
var arr = [];
Object.keys(obj).forEach(function(key){
arr.push([key, obj[key]]);
});
return arr;
}
}
console(bareObj);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 00:15:23