有很多类似的问题,但我无法得到他们的答案。
let obj = {};
const key;//a string
const value;//a string
obj[key].push(value);
显然这行不通,但我不知道该怎么做。我希望它添加一个新的键和值(如果它不存在),但是如果它不存在,则应将其附加到该特定键的值的末尾。即类似于数组的常规推入操作。
预期行为:
key = 'hello'
value = 'thanks'
obj = {'hello' : ['thanks']}
key = 'goodbye'
value = 'ok'
obj = {'hello' : ['thanks'], 'goodbye' : ['ok']}
key = 'hello'
value = 'why'
obj = {'hello' : ['thanks','why'], 'goodbye' : ['ok']}
键“ hello”的末尾附加值“为什么”。
编辑:所有值都放入数组。
答案 0 :(得分:5)
您可以为此创建自定义函数,以检查键是否存在于对象中,并根据该键直接设置值或将其转换为数组。
let obj = {
foo: 'bar'
};
let add = (obj, key, val) => {
if (key in obj) obj[key] = [].concat(obj[key], val);
else obj[key] = val;
}
add(obj, 'foo', 'baz');
add(obj, 'bar', 'baz');
console.log(obj)
您还可以将Proxy
与set
陷阱一起使用,当您尝试在代理对象上设置新属性时将运行该陷阱。
const obj = {
foo: 'bar'
}
const proxy = new Proxy(obj, {
set(obj, prop, value) {
if (prop in obj) obj[prop] = [].concat(obj[prop], value)
else obj[prop] = value;
}
})
proxy.foo = 'bar';
proxy.bar = 'baz';
console.log(proxy)
答案 1 :(得分:1)
非常简单-使用逻辑OR运算符||
:
let obj = {};
const key = "key";
const value = "value";
obj[key] = obj[key] || [];
obj[key].push(value);
obj[key].push("anotherValue");
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: auto; }
答案 2 :(得分:1)
您也可以通过一种简洁的方式通过Object.assign进行此操作:
let o = {}
let add = (obj, k, v) => Object.assign(obj, obj[k]
? { [k]: [].concat(obj[k], v) }
: { [k]: v })
console.log(add(o, 'a', 1))
console.log(add(o, 'b', 2))
console.log(add(o, 'a', 3))
console.log(add(o, 'a', 4))
这个想法是使用三元运算符并检查我们是否已经有键,如果有的话将其连接到一个新数组。否则,只需分配一个新对象即可。
答案 3 :(得分:0)
您可以根据需要创建原型函数
_see_voice_channels
答案 4 :(得分:-1)
尝试(我考虑了this comment)
let obj = {};
const key = 'some_key';//a string
const value = 'first value' ;//a string
obj[key]= (obj[key]||[]).concat(value);
obj[key]= (obj[key]||[]).concat('next value');
console.log(obj);
答案 5 :(得分:-2)
尝试一下。但是,这也会将第一个值放入数组中,但是如果您知道它将是一个值数组,则这是标准行为。
if(obj[key]){
obj[key].push(value);
}
else{
obj[key] = [value];
}