Добавить новое поле списка к объекту в javascript - PullRequest
2 голосов
/ 17 апреля 2020

Я изо всех сил пытаюсь добавить (преобразовать json в список jsons) список в json. Вот пример:

config = {
  existing_variable: 'example'
}


addToListing = (field, value, index=0) => {
  config = {
    ...config,
    listing: {   
      ...config.listing,
      [field]: value
    }   
  }
}

addToListing('first', 1, 0)
addToListing('second', 2, 0)
addToListing('first', 3, 1)


console.log(config)

Результат:

{
  existing_variable: 'example', 
  listing: 
  { 
    first: 3, 
    second: 2 
  } 
}

Ожидаемый результат:

{ 
  existing_variable: 'example', 
  listing: 
  [
    {first: 1, second: 2}, 
    {first: 3}
  ] 
}

Я пробовал разные подходы, но то, что я сделал, не было ' не подходит (например, вложенные значения или полная инициализация в начале).

Не могли бы вы помочь?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Вы можете добавить несколько проверок и перемотать массив.

const addToListing = (field, value, index=0) => {
    config = {
        ...config,
        listing: Object.assign(
            [],
            (config.listing || []), 
            { [index]: { ...(config.listing?.[index] || []), [field]: value } }
        )    
    }
};

var config = { existing_variable: 'example' };

addToListing('first', 1, 0);
addToListing('second', 2, 0);
addToListing('first', 3, 1);

console.log(config)
.as-console-wrapper { max-height: 100% !important; top: 0; }

Без опциональный оператор цепочки ?., но с другими значениями по умолчанию.

const addToListing = (field, value, index=0) => {
    config = {
        ...config,
        listing: Object.assign(
            [],
            (config.listing || []), 
            { [index]: { ...((config.listing || [])[index] || []), [field]: value } }
        )    
    }
};

var config = { existing_variable: 'example' };

addToListing('first', 1, 0);
addToListing('second', 2, 0);
addToListing('first', 3, 1);

console.log(config)
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 17 апреля 2020

Я предлагаю альтернативный подход с использованием Array.prototype.splice().

let config = {
  existing_variable: 'example'
}


const addToListing = (field, value, index = 0) => {
	// If listing property not exists then init it with an empty array
	config.listing || (config.listing = [])
	
	config.listing.splice(index, 1, (config.listing[index] ? {...config.listing[index], [field]: value} : {[field]: value}));
}

addToListing('first', 1, 0)
addToListing('second', 2, 0)
addToListing('first', 3, 1)


console.log(config);
.as-console-wrapper {min-height: 100% !important; top: 0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...