将键推送到数组或javascript对象?
我需要创建一个带有特定键的数组或js对象,它应该被推送到一个空数组或js对象。之后,我需要根据这些键推送一些特定的值,比如:将键推送到数组或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
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