将键推送到数组或javascript对象?

将键推送到数组或javascript对象?,javascript,Javascript,我需要创建一个带有特定键的数组或js对象,它应该被推送到一个空数组或js对象。之后,我需要根据这些键推送一些特定的值,比如: var arr = ["john":["jval1","jval2"], "matt":["mval1","mval2","mval3"]] 我知道这不是js对象或数组的rigt表示法,但这就是想法 这基本上就是我要做的: var keys = ["john","matt"]; //my keys var jvals = ["jval1","jv

我需要创建一个带有特定键的数组或js对象,它应该被推送到一个空数组或js对象。之后,我需要根据这些键推送一些特定的值,比如:

var arr = ["john":["jval1","jval2"], "matt":["mval1","mval2","mval3"]]
我知道这不是js对象或数组的rigt表示法,但这就是想法

这基本上就是我要做的:

var keys = ["john","matt"];             //my keys
var jvals = ["jval1","jval2"];          //my values for key john
var mvals = ["mval1","mval2","mval3"];  //my values for key matt

var arr = [];

for(var i in keys) arr.push(keys[i])  //pushing the names (I need to push this names as keys so next lines should work)

for(var i in jvals) arr["john"].push(jvals[i])  //Trying to push john values, which doesn't work because "john is not a key"
for(var i in mvals) arr["matt"].push(mvals[i])  //Same.
这根本不起作用,我该怎么做?

这是你想要的吗

将arr声明为对象并添加带有空数组的键。然后按到键

var-keys=[“john”,“matt”]//我的钥匙
var jvals=[“jval1”,“jval2”]//我对约翰的价值观
var mvals=[“mval1”、“mval2”、“mval3”]//我对基马特的价值观
var arr={};
对于(键中的var i)arr[键[i]]=[];
对于(jvals中的var i)arr[“john”].push(jvals[i]);
对于(mvals中的var i)arr[“matt”]。推送(mvals[i]);
控制台日志(arr)这是你想要的吗

将arr声明为对象并添加带有空数组的键。然后按到键

var-keys=[“john”,“matt”]//我的钥匙
var jvals=[“jval1”,“jval2”]//我对约翰的价值观
var mvals=[“mval1”、“mval2”、“mval3”]//我对基马特的价值观
var arr={};
对于(键中的var i)arr[键[i]]=[];
对于(jvals中的var i)arr[“john”].push(jvals[i]);
对于(mvals中的var i)arr[“matt”]。推送(mvals[i]);

控制台日志(arr)以下是使用forEach
更简短的代码版本

var-keys=[“john”,“matt”]//我的钥匙
var jvals=[“jval1”,“jval2”]//我对约翰的价值观
var mvals=[“mval1”、“mval2”、“mval3”]//我对基马特的价值观
变量对象={}
keys.forEach(函数(键,索引){
对象[key]=index==0?jvals.slice():mvals.slice()
});

console.log(object)
下面是使用forEach的
更简短的代码版本

var-keys=[“john”,“matt”]//我的钥匙
var jvals=[“jval1”,“jval2”]//我对约翰的价值观
var mvals=[“mval1”、“mval2”、“mval3”]//我对基马特的价值观
变量对象={}
keys.forEach(函数(键,索引){
对象[key]=index==0?jvals.slice():mvals.slice()
});

console.log(object)
好的,我知道你想做什么了。代码的第一个问题是在将
的值推入
数组后,如何处理
arr
数组:

for(...) {
    arr["john"].push(jvals[i]);
}
您所做的就是说
arr.john.push(…)
,但是
arr
没有名为
john
的属性,即数组。
arr
所具有的是索引0处的一个元素,其值为
“john”
。也就是说,
arr
看起来很像这个
arr=[“john”,“matt”]

现在您要做的是将
arr
更改为对象而不是数组

这样,您的代码将如下所示:

var keys = ["john","matt"];
var jvals = ["jval1","jval2"];
var mvals = ["mval1","mval2","mval3"];

var arr = {};

arr["john"] = jvals;
arr["matt"] = mvals;

// Please don't do the above

// Doing the following (using an object literal) is much better, and what most will advice when creating objects in js.

var arr = {
    john: ["jval1","jval2"],
    matt: ["mval1","mval2","mval3"]
};

好的,我明白你想做什么了。代码的第一个问题是在将
的值推入
数组后,如何处理
arr
数组:

for(...) {
    arr["john"].push(jvals[i]);
}
您所做的就是说
arr.john.push(…)
,但是
arr
没有名为
john
的属性,即数组。
arr
所具有的是索引0处的一个元素,其值为
“john”
。也就是说,
arr
看起来很像这个
arr=[“john”,“matt”]

现在您要做的是将
arr
更改为对象而不是数组

这样,您的代码将如下所示:

var keys = ["john","matt"];
var jvals = ["jval1","jval2"];
var mvals = ["mval1","mval2","mval3"];

var arr = {};

arr["john"] = jvals;
arr["matt"] = mvals;

// Please don't do the above

// Doing the following (using an object literal) is much better, and what most will advice when creating objects in js.

var arr = {
    john: ["jval1","jval2"],
    matt: ["mval1","mval2","mval3"]
};


是的,就是这样!太高兴了。接受它解决了你的问题的答案。@RobertoSepúlveda我当然会的,但6分钟后在数组中使用
for…in
是不正确的。您应该使用数字循环或
forEach()
。以斯拉文的答案为例,我真的无法建议接受什么样的答案;我在这里的一个建议是,在接受任何答案之前,总是要等待一段时间。从现有的两个答案中可以看出,每个答案都为问题带来了一些不同的见解。我建议在接受任何答案之前等待一天左右,这样你就不会阻止其他人发布答案,因为这些答案可能会让问题变得更加清楚。是的,就是这样!太高兴了。接受它解决了你的问题的答案。@RobertoSepúlveda我当然会的,但6分钟后在数组中使用
for…in
是不正确的。您应该使用数字循环或
forEach()
。以斯拉文的答案为例,我真的无法建议接受什么样的答案;我在这里的一个建议是,在接受任何答案之前,总是要等待一段时间。从现有的两个答案中可以看出,每个答案都为问题带来了一些不同的见解。我建议在接受任何答案之前等待一天左右,这样你就不会劝阻其他人发布可能更能说明问题的答案。值得注意的是,此代码不会像OP的代码那样复制
jvals
mvals
数组;它直接使用这些数组。如果需要复制数组,那么可以使用
?jvals.slice():mvals.slice()
forEach()
回调内的赋值中。为什么要复制数组?你的意思是这些值将来可能会改变吗?我们对OP试图解决的实际问题了解得不够,无法确定我们是真的复制数组还是仅仅为数组分配引用。在实际代码中,这可能会产生很大的差异,因为正如您所提到的,如果源数组稍后更改,那么它也会更改存储在
对象中的数组,反之亦然。由于OP的代码确实复制了数组,所以在改进的代码中也复制它可能是最安全的。@MichaelGeary,根据您的建议添加了更改。谢谢。:)值得注意的是,此代码不会复制
jvals