Как я могу динамически добавить пару ключ-значение в массив объектов, используя карту - PullRequest
4 голосов
/ 22 января 2020

Я знаю, что это простой вопрос, но я не понимаю, почему мой код ведет себя так, как он. Я пытаюсь динамически добавить свойство в массив объектов с помощью array.map (). Я могу заставить свой код работать так, как я хочу, и выполнить мои тесты, но мне приходится жестко кодировать ключ, который не делает функцию гибкой / многократно используемой и является своего рода «хаком».

Пример:

// this works but I have to hard code the key 'profession' & not quite how I want it to work

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, profession: value }))
}

// I don't understand why this doesn't work...

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, obj[key]: value }))
}

// or this doesn't work either...

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, obj['key']: value }))
}

// or this...even if I'm already enclosing the key in template strings
// which should effectively set the key as a string which is the reason
// why my first example worked

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, `${key}`: value }))
}

 addKeyValue([{name: 'Moe'}, {name: 'Larry'}, {name: 'Curly'}], 'profession', 'comedian') 

// [{name: 'Moe', profession: 'comedian'}, {name: 'Larry', profession: 'comedian'}, {name: 'Curly', profession: 'comedian'}]

Я знаю, что это, вероятно, очень простая вещь, которую я упускаю из виду и тоже не понимаю, поэтому заранее спасибо всем за помощь! :)

Ответы [ 2 ]

5 голосов
/ 22 января 2020

Вам нужно имя вычисляемого свойства .

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, [key]: value }));
}

console.log(addKeyValue([{ name: 'Moe' }, { name: 'Larry' }, { name: 'Curly' }], 'profession', 'comedian'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
5 голосов
/ 22 января 2020

Чтобы использовать выражение в качестве ключа в литерале объекта, поместите его в [].

function addKeyValue(arr,key,value) {
    return arr.map((obj) => ({...obj, [key]: value }))
}

См. Создание объекта с динамическими c именами свойств

...