Javascript 基于JS中的键将值附加到对象内部的数组
我有一个对象,希望根据键将值附加到其中的数组中 例如Javascript 基于JS中的键将值附加到对象内部的数组,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象,希望根据键将值附加到其中的数组中 例如 var A = {}; A[room1] = ["1"]; A[room2] = ["2"]; A[room3] = ["3"]; 看起来像 A = {"room1":["1"], "room2":["2"], "room3":["3"]}; 但我想要的是,每当用户给出一些与已经添加的键对应的值时,而不是覆盖我想要附加在其中的前一个值 例如,如果值为101,我希望将其添加到键room1,以便以后可以轻松检索这些值 所以这次整个物体变成了
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 = [];
只要我把它推到数组中
arr.push(value);
但是将其推到数组会导致向所有而不是相应的键添加值。[此答案的第一部分基于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];
}
}
[[此答案的第一部分基于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];
}
}
试试这个
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.");
}
}
试试这个
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.");
}
}
您的要求也可以通过这种方式实现
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];
}
}
您的要求也可以通过这种方式实现
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];
}
}
你试图解决什么问题?你到底在哪里?你知道数组是如何工作的吗?是的,我知道,我正在使用
.push()向数组添加值
但关键是,应将值添加到相应的keyFYI中,这是一个令人讨厌的数据结构。任何读者都必须在使用数据之前检查数据类型。为什么不让每个元素都成为一个数组,其中包含一个或多个元素?您试图解决什么问题?您到底在哪里卡住了?请回答你们知道数组是如何工作的吗?是的,我知道,我正在使用.push()向数组添加值
但重点是值应该添加到相应的keyFYI中,这是一个令人讨厌的数据结构。任何读者都必须在能够使用数据之前检查数据的类型。为什么不让每个元素都成为一个数组,其中包含一个或多个元素?数组。isArray难道不更简单吗?@SimonM-是的,在新的b中rowsers必须具备这一点。需要IE9。如果这是我的代码,我可能会有一种跨浏览器的方式来检查数组,作为isArray的垫片或实用函数。注意……我应该检查一下。我已经更新了问题,在这种情况下,你的答案也会一样吗???@VarunMalhotra-将来,请不要更改你的问题是一个全新的问题,就像你刚才所做的那样,因为它会使人们为帮助你所做的一切无效,而这对他们来说确实是不公平的。如果必须的话,你可以在你的问题中添加一些新的内容,但不要改变整个内容。无论如何,看看我在回答的末尾已经添加了什么。不会Array.isArray吗
更简单?@SimonM-是的,在新的浏览器中有足够的功能。需要IE9。如果它是我的代码,我可能会有一种跨浏览器的方法来检查数组作为iArray的垫片或作为实用函数。注意……我应该检查一下。我已经更新了问题,在这种情况下,你的答案也会一样吗??@VarunMalhotra-在未来,请不要像你刚才那样把你的问题变成一个全新的问题,因为这会使人们为帮助你所做的一切无效,这对他们来说真的不公平。如果你必须的话,你可以在你的问题中添加一些新内容,但不要改变整个问题。无论如何,看看我已经添加了什么答案的结尾。当为键添加第二个值时,会丢失currentVal
。它也不会