Можете ли вы создавать имена свойств объекта, используя литералы шаблона в JavaScript? - PullRequest
0 голосов
/ 17 октября 2018

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

function transformFirstAndLast(array){
    return {`${array[0]}`: array[length-1];}
}

Выше приведено сообщение об ошибке.Может кто-нибудь дать подробное объяснение, почему это не работает?Я хотел бы избежать создания отдельных переменных для хранения значений из первого и последнего индексов массива.

Ответы [ 5 ]

0 голосов
/ 17 октября 2018

var input = ["name", "fname", "lname", "stackOverflow"];

function transformFirstAndLast(array){
    return {[array[0]]: array.pop()}
}

responseObject = transformFirstAndLast(input)
console.log(responseObject)
0 голосов
/ 17 октября 2018

Ваш вопрос действительно сводится к тому, «Могу ли я использовать выражения в качестве ключей в литералах объекта?»

Ответ «да» (начиная с es6):

function yell(template, ...parts) {
  return parts[0] + '!';
}

function foo() {
    return 'bar';
}

class Person {
    constructor(first, last) {
        this.first = first;
        this.last = last;
    }
    
    toString() {
        return `${this.first} ${this.last}`;
    }
}

let names = ['Abe'];

let my_obj = {
    [3+5]: 'some_value',
    [yell `${foo()}`]: foo(),
    [names[0]]: 64,
    [new Person('Rafael', 'Cepeda')]: 25
};

console.log(my_obj);

Пока выражение вычисляется в строку, все справедливо.

0 голосов
/ 17 октября 2018

Я полагаю, что шаблонный литерал здесь не нужен, просто попробуйте вот так после исправления этой строки array[length-1], потому что неправильный, правильный - array[array.length-1].Я добавил более подробный код, но вы также можете сделать сокращенную версию, например, return {[array[0]]: array[array.length-1]}; для вашей функции transformFirstAndLast(array).

function transformFirstAndLast(array){
    const result = {};
    result[array[0]] = array[array.length-1]; 
    return result;
}

console.log(transformFirstAndLast(['a','b','c','d','e']))
0 голосов
/ 17 октября 2018

да, вы можете использовать строковые литералы в качестве ключа.Но дело в том, что они рассчитываются во время выполнения.Поэтому вы должны относиться к ним как к выражениям.И чтобы переменные / выражения были вашими ключами, вам нужно обернуть их внутри []

let a = {
  `key`: value
} // is not allowed

let a = {
  [`key`]: value
} // is allowed since you have wrapp

для вашего дела

return {[`${array[0]}`]: array[array.length-1]};

Теперь, когда вы завернули элемент array[0] внутристроковый литерал, вы получите строковые значения для вашего нулевого элемента.Если ваш array[0] будет объектом, это тоже не сработает.Это должна быть либо строка, либо число.В противном случае вы получите "[object Object]" в качестве ключа

0 голосов
/ 17 октября 2018

Вам не хватает {, и вы не можете использовать строки шаблона в качестве ключа.Чтобы использовать «переменную» в качестве ключа в объекте, вы должны использовать скобки вокруг переменной.Вот рабочий код.

function transformFirstAndLast(array){
    return {[array[0]]: array[array.length-1]};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...