带字符串键的访问数组

时间:2019-09-30 12:42:29

标签: javascript json

我在JSON文件中有两个变量。第一个是键列表,如下所示:

keylist = ["key1","key2","key3"]

第二个是从数据库生成的,看起来像这样:

data = {
    "key1"{
         #further data
    },
    "key2"{
        #further data 
    },
    "key3"{
        #further data
    }
}

现在,我想使用keylist

中的密钥访问数据库的第二个元素
data.keylist[1];

哪个不起作用,因为keylist [1]的返回是字符串?我做了一些研究,并提出了使用窗口函数的建议。所以我尝试了这个:

window["data." + keylist[1]]();

这将导致“不是函数”错误。我该怎么办才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

就这么简单:

const mydata = data[ keylist[1] ];

此外,从语法角度来说,您的代码是正确的,但它所讲述的与您期望的完全不同。

data.keylist[1];

告诉JS您期望拥有一个名为data的对象,该对象具有一个名为keylist的属性,并且(很可能是)数组类型,并且您想要获取此数组的第二个元素

PS:还有一点。您的问题标题不完全正确,因为JS中的数组和对象之间存在差异。

JS中没有用于数组的“字符串键”,因此您不能“使用字符串键访问数组”。好吧,确实存在,但不是数组项。数组项仅具有数字索引,可用于访问它。与数组相反,对象可能具有命名属性。因此,当您看到类似这样的内容:data = myVar['data']时,您可以说您正在处理一个对象,而data = someVar[0]既可以是一个数组(最有可能),也可以是一个名为' 0'。

答案 1 :(得分:2)

我不认为您遇到的第一个示例的问题是因为它返回了密钥。我认为问题是因为private void EllipticCurveDiffieHellman() { var ecdh = new ECDiffieHellmanCng(ECCurve.NamedCurves.brainpoolP256r1); ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; ecdh.HashAlgorithm = CngAlgorithm.Sha256; //get relevant point from own public key var ownPublicKey = ecdh.PublicKey.ExportExplicitParameters().Q; var peersPublicKey = SendPublicKey(ownPublicKey); //key exchange var sharedSecret = ecdh.DeriveKeyMaterial(peersPublicKey); Console.WriteLine("Key: " + HexValue.Parse(sharedSecret.ToArray())); } DiffieHellmanPublicKey ToPublicKey(byte[] publicKey) { var keyLength = 32; if (publicKey[0] != (2 + 2 * keyLength) - 1) throw new ArgumentException("Invalid key length", nameof(publicKey)); if (publicKey[1] != 0x04) throw new ArgumentException("Invalid key format", nameof(publicKey)); var parameters = new ECParameters() { Curve = ECCurve.NamedCurves.brainpoolP256r1, Q = new ECPoint() { X = publicKey.Skip(2).Take(keyLength).ToArray(), Y = publicKey.Skip(2 + keyLength).Take(keyLength).ToArray() } }; using (var tmp = ECDiffieHellman.Create(parameters)) { return tmp.PublicKey; } } 没有名为data的属性。与其相反,请尝试

keylist

,看看是否适合您。该代码应该起作用的原因是,在这种情况下,Javascript将评估data[keylist[1]] 的字符串返回值,然后将其用作keylist[1]变量的字符串索引。让我知道这是否对您有用:D

答案 2 :(得分:1)

您可以尝试使用类似这样的内容。

data[keylist[1]]