我有一个对象,并希望根据键将值附加到其中的数组。
例如。
var A = {};
A[room1] = ["1"];
A[room2] = ["2"];
A[room3] = ["3"];
看起来像
A = {"room1":["1"], "room2":["2"], "room3":["3"]};
但我想要的是每当用户给出与已添加的键相对应的值时,而不是覆盖我想要附加到其中的先前值。
例如,如果值为101
,我想将其添加到键room1
,以便以后可以轻松检索这些值。
这次整个对象变成了
A = {"room1":["1","101"], "room2":["2"], "room3":["3"]};
现在,如果我想将201
添加到密钥room2
,它将是:
A = {"room1":["1","101"], "room2":["2","201"], "room3":["3"]};
我尝试了什么?
我有一个数组。我不想使用很多数组。
var arr = [];
每当值cam我将它推到数组
arr.push(value);
但是将它推送到数组会导致所有值都不添加到相应的键
答案 0 :(得分:4)
[[这个答案的第一部分是基于OP问题的先前版本,现在已经编辑到另一个问题。请参阅本答案的第二部分,了解适用于当前问题编辑的解决方案(当整个问题变为其他问题时,它确实会让事情变得混乱。]]
您只需测试密钥是否已存在,并检查其中是否已存在数组。如果密钥不存在,请添加它。如果密钥存在且它已经是一个数组,只需将另一个值压入数组即可。如果密钥存在,但它不是数组,请抓取该值,然后将密钥重置为包含前两个值的数组。
这是执行此操作的代码:
function addValue(obj, key, value) {
if (obj.hasOwnProperty(key)) {
// check if it's already an array using the recommended way of detecting an array
if (Object.prototype.toString.call(obj[key]) === "[object Array]")
obj[key].push(value);
} else {
var firstVal = obj[key];
obj[key] = [firstVal, value];
}
} else {
obj[key] = value;
}
}
仅供参考,您的数据结构选择难以同时读取和写入,因为读取器和写入器必须先检查值的类型才能对其进行操作。如果项只是总是带有一个或多个元素的数组会更容易。
// one item for each key
A = {"room1":["1"], "room2":["2"], "room3":["3"]};
// add 101 to room 1
A = {"room1":["1","101"], "room2:["2"], "room3":["3"]};
// add 201 to room 2
A = {"room1":["1","101"], "room2":["2","201"], "room3":["3"]};
然后,您需要任何特殊代码来读取和写入,您只需检查密钥是否存在,如果存在,则将新值推入其中。如果没有,请添加数组。
在这种情况下,添加一个值就是这个
function addValue(obj, key, value) {
if (obj.hasOwnProperty(key)) {
obj[key].push(value);
} else {
obj[key] = [value];
}
}
答案 1 :(得分:1)
试试这个
function pushValue(obj, key, value)
{
if(obj.hasOwnProperty(key) {
var currentVal = obj[key];
if(currentVal instanceof Array)
obj[key].push(value);
else
obj[key] = [currentVal, value];
} else {
alert("No such key.");
}
}
答案 2 :(得分:1)
您的要求也可以通过这种方式实现。
function pushValue(obj, key, value)
{
if(obj[key])
{
if(obj[key].push)
{
obj[key][obj[key].length] = value;
}
else
{
var xContainedVal = obj[key];
obj[key] =[xContainedVal, value];
}
}
else
{
alert("Key Not Found!");
}
}
更新:
function pushValue(obj, key, value)
{
if(obj[key])
{
obj[key][obj[key].length] = value;
}
else
{
obj[key] =[value];
}
}