我刚开始在JavaScript中使用关联数组。我有点明白它们不是真正的数组,但它们似乎符合我的目的,即将一些配置数据从记录加载到一些会话范围变量中,这样我就可以很容易地访问它们。
现在我有一个数据结构,每个键可以有多个值。我无法加载它。
下面是一些伪代码。它运行一个循环,加载一个关联数组,以便我有以下内容:
键=" App1的"值=" App1Title1,App1Title2等" 键=" App2的"值=" App2Title1,App2Title2等"
这样做的最佳方式是什么?
var tmpDes = {};
//Loop through data records
//Load the values below from loop, not hardcoded like here.
var keyStr:String = "key";
var valStr1:String = "value1";
var valStr2:String = "value2";
//This seems to work
tmpDes[tmpStr] = "xpApp1Title1";
tmpDes[tmpStr] = tmpDes[tmpStr] + "," + tmpStr1;
//
=============================================== ========== 这些都是很好的答案。我确实从搜索周围发现这些不是真正的关联数组而是对象,我应该提到它。
Dan,问题是我在一个docs表的循环中,所以当我构造js对象时,我不知道valStr1和valStr2。我真正想要的是使用" push"但这些并不是真正的数组,因此不起作用。
=============================================== ====
这是更接近但问题是我不知道将来自文档的值,我不明白如何使数组名称来自变量。
文件中的文件包含这些字段
关键值 App1 App1Title1 App1 App1Title2 App2 App2Title1 App2 App2Title2 等
我需要创建一个结构,这样如果我调用App1,我可以得到一个列表==> " App1Title1":" App1Title2"
所以我创建了我的对象和临时字符串变量,然后开始阅读文档。
从第一个文档加载临时变量。
然后我想设置obj。但我想动态地这样做。
所以行
obj.tmpKey.push(tmpVal)
应该执行
obj.App1.push(AppTitle1).
但显然我是如何写它的,它不会用tmpVal加载tmpKey
也许我使用了错误的结构?我愿意改变它。
var obj = {};
var tmpKey:String;
var tmpVal:String
//Loop docs, getting values.
tmpKey = doc.getItemValueString("var1");
tmpVal = doc.getItemValueString("var2");
obj.tmpKey.push(tmpVal);
//Loop
答案 0 :(得分:3)
在JavaScript中我们调用关联数组Objects
,JS中的所有内容都是Object
甚至是Functions
。
我会告诉你一些事情。
首先,当声明Object
时,这是首选方法。
var obj = {
key: 'value', //Any object or value can be used here.
}
然后我可以用各种方式访问它。
点符号(首选):
obj.key === 'value' //True
数组表示法(当你绝望时):
obj['key'] === 'value' //True
当您希望key
打破JS变量命名语法时,通常会使用数组表示法,例如:
var headers = {
'Content-Type': 'application/json'
}
headers['Content-Type'] === 'application/json' //True
或者您正在遍历一组Object
个键。
var keys = Object.keys(headers);
keys.forEach(function(key) {
console.log(headers[key]);
});
Objects
可以提供大量内容,请阅读此MDN Docs以及许多其他JS Objects
以获取详细信息。
答案 1 :(得分:1)
这不是关联数组。在Javascript中,我们将其称为Object
,这是一个不同的东西,尽管您可以经常使用它们与其他语言称为关联数组,散列或字典的方式类似。
Object
具有属性(类似于键)。您可以将数组(和其他类型)存储为var obj = {};
obj.aThing = [];
obj.anotherThing = [];
obj.aThing.push("foo");
obj.aThing.push("bar");
obj.anotherThing.push("a");
obj.anotherThing.push("b");
obj.anotherThing.push("c");
console.log("aThing", obj.aThing);
console.log("anotherThing", obj.anotherThing);
属性的值。
aThing [ "foo", "bar" ]
anotherThing [ "a", "b", "c" ]
将产生输出:
objectName[varName]
您提到您需要使属性名称来自变量,Javascript也允许这样做。您需要使用var obj = {};
var name1 = "aThing";
var name2 = "anotherThing";
obj[name1] = [];
obj[name2] = [];
obj[name1].push("foo");
obj[name1].push("bar");
obj[name2].push("a");
obj[name2].push("b");
obj[name2].push("c");
console.log(name1, obj[name1]);
console.log(name2, obj[name2]);
代替,例如此示例。
var obj = {};
obj["aThing"] = [];
obj["anotherThing"] = [];
obj["aThing"].push("foo");
obj["aThing"].push("bar");
obj["anotherThing"].push("a");
obj["anotherThing"].push("b");
obj["anotherThing"].push("c");
console.log("aThing", obj["aThing"]);
console.log("anotherThing", obj["anotherThing"]);
使用变量作为对象键是相同的代码。
最后,您可以直接使用字符串作为属性名称。
## Your data
dat <- c( 5,6,8,1,3,4,2,7)
## Get the number of buckets
count <- 0
for (i in seq_along(dat))
if (!((dat[i] - 1) %in% dat[1:i])) count <- count+1
count
# 4