具有多个值的代码关联javascript数组

时间:2015-07-16 18:41:12

标签: javascript xpages xpages-ssjs

我刚开始在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

2 个答案:

答案 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