JavaScript добавляет значение к объекту - PullRequest
3 голосов
/ 05 июня 2019

Есть довольно много похожих вопросов, но я не мог заставить их ответы работать.

 let obj = {};

 const key;//a string
 const value;//a string

 obj[key].push(value);

Очевидно, что это не работает, но я не знаю, как это сделать. Я хочу, чтобы он добавил новый ключ и значение, если он не существует, но если он действительно существует, он должен добавить его в конец значений для этого конкретного ключа. то есть как обычное push-действие с массивами.

Ожидаемое поведение:

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

Значение «почему» добавляется в конец для ключа «Привет».

РЕДАКТИРОВАТЬ: все значения помещаются в массивы.

Ответы [ 6 ]

5 голосов
/ 05 июня 2019

Для этого можно создать пользовательскую функцию, которая проверяет, существует ли ключ в объекте, и на основании этого непосредственно устанавливает значение или превращает его в массив.

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 голос
/ 05 июня 2019

Вы также можете сделать это через 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))

Идея состоит в том, чтобы использовать троичный оператор и проверить, есть ли у нас ключ, и если да, соединить его с новым массивом. в противном случае просто назначьте новый объект.

1 голос
/ 05 июня 2019

Довольно просто - используйте логический оператор ИЛИ ||:

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; }
0 голосов
/ 05 июня 2019

Вы можете создать функцию-прототип для ваших требований

Object.prototype.add = function(key, value) {
  if( this[key] != undefined) this[key] = [].concat(this[key], value);
  else this[key] = value;
};

let obj = {'hello' : 'thanks', 'goodbye' : 'ok'}

let key = 'hello'
let value = 'why'
//obj[key] = value;
obj.add(key,value);
console.log(obj)
0 голосов
/ 05 июня 2019

Попробуй это. Однако это также поместит первое значение в массив, но это довольно стандартное поведение, если вы знаете, что это будет массив значений.

  if(obj[key]){
    obj[key].push(value);
  }
  else{
    obj[key] = [value];
  }
0 голосов
/ 05 июня 2019

Попробуйте (я принимаю к сведению этот комментарий )

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...