var test = "test123"
var test123 ={
"key" + test: 123
}
Questo codice non funziona. Cosa c'è di sbagliato con "chiave" + test?Utilizzare una stringa concatenata (dinamica) come chiave di oggetti JavaScript?
var test = "test123"
var test123 ={
"key" + test: 123
}
Questo codice non funziona. Cosa c'è di sbagliato con "chiave" + test?Utilizzare una stringa concatenata (dinamica) come chiave di oggetti JavaScript?
Perché "key" + test
è un'espressione e non un identificatore né una stringa letterale né un numero letterale, che sono le uniche cose consentite come chiave in un oggetto letterale.
Devi usare la notazione []
dopo aver creato l'oggetto per una chiave così dinamico:
var test123 = {};
test123["key" + test] = 123;
Un identificatore è fondamentalmente lo stesso sottoinsieme di caratteri che si può chiamare una variabile (lettere, numeri, _
e $
; potrebbe non iniziare con un numero) e una stringa letterale è qualsiasi stringa inclusa con '
o "
.
Quindi, gli unici tipi di chiavi è possibile utilizzare in un oggetto letterale sono:
{
a0: true, // valid identifier
$$_: true, // same
123: true, // valid numeric literal
012: true, // same (octal)
0xf: true, // same (hex)
"@": true, // not allowed as an identifier
'0a': true // same
}
Riferimento: http://es5.github.com/#x11.1.5.
PropertyName:
IdentifierName
letterale stringa
NumericLiteral
Inoltre, i numeri sono consentiti anche nel letterale dell'oggetto, come '0' o' 5e10' (ma non '-10' perché' -' non fa parte del numero letterale ma dell'operatore '' 'unario). –
@Felix Kling: In effetti lo sono, grazie. – pimvdb
È possibile ma non con la notazione letterale (pre ES6).
var test123 = {};
test123["foo" + "bar"] = 'baz';
test123.foobar === 'baz'; // true
Grazie per la semplice risposta, è proprio quello che stavo cercando :) –
Il codice è equivalente al test123.("key" + test) = 123
che può meglio aiutare a capire il motivo per cui è sbagliato.
È necessaria la notazione ["name"]
per poter accedere ai campi con il loro nome in stringa. Altre notazioni (le tue e .
) richiedono identificatori.
--HTML--
<div id="name1"></div>
<div id="name2"></div>
<div id="name3"></div>
--JS--
function getJsonData(){
var hr = new XMLHttpRequest();
hr.open("GET", "bookJson.json", true);
hr.setRequestHeader("Content-type", "application/json", true);
hr.onreadystatechange = function() {
if(hr.readyState == 4 && hr.status == 200) {
var data = JSON.parse(hr.responseText);
for(var i=0;i<3;i++){
var a = "p"+(i+1)+"H";
$("#name"+(i+1)).html(data[objName][a]);
}
}
}
hr.send(null);
}
---JSON--- save JSON file name as bookJson.json
{ "objName":
{
"p1H":"content1",
"p2H":"content2",
"p3H":"content3",
}
}
-----------------------------------
json object key name p1H,p2H,p3H ...
We want to dynamically get this keys in javacript instead of **data[objName].p1H**. you can get dynamical key like **data[objName]["p1H"]**
Si prega di fornire una spiegazione della risposta per aiutare gli altri utenti del sito. Le risposte al solo codice non sono molto utili e tendono ad essere contrassegnate come di bassa qualità e potenzialmente cancellate. – Tristan
Grazie per il suggerimento, ho fornito una spiegazione della mia risposta ... –
JavaScript fornisce due modi per definire una proprietà di un oggetto:
In questa situazione, propertyName non è modificabile e non è calcolabile.non è possibile effettuare le seguenti operazioni:
object.('property'+'Name')
come si può vedere
object = {propertyName:value};
object = {'propertyName':value};
sono uguali
si può fare:
var a = "propertyName";
object[a] = value;
e questa volta è necessario utilizzare una stringa
object[propertyName] = value;//error
object["propertyName"] = value;//correct
object = {'propertyName':value};//correct
object = {propertyName:value};//correct
Con ES6, è possibile definire i tasti dinamici all'interno di un oggetto letterale:
const test = "test123"
const test123 = { ["key" + test]: 123 };
Da una leggera angolazione diversa: http://stackoverflow.com/questions/2241875/how-to-create-objec t-property-from-variable-value-in-javascript –