JavaScript将值附加到对象

时间:2019-06-05 06:52:39

标签: javascript arrays object

有很多类似的问题,但我无法得到他们的答案。

 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”的末尾附加值“为什么”。

编辑:所有值都放入数组。

6 个答案:

答案 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)

您还可以将Proxyset陷阱一起使用,当您尝试在代理对象上设置新属性时将运行该陷阱。

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];
  }