Использование оператора распространения ES6 для объекта, возвращаемого функцией - PullRequest
0 голосов
/ 22 января 2020

Я использую функцию для преобразования шестнадцатеричных кодов в значения rgb, ее я нашел на этом сайте, и все работает отлично. Функция принимает в качестве параметра строку и возвращает объект с r,g,b свойствами и связанными с ними значениями.

Затем я беру эти значения и печатаю их внутри функционального компонента React. Я просто хотел привести в порядок синтаксис и избежать:

rgbValue={'rgb=(' + hexToRgb('#000').r + ', ' + hexToRgb('#000').g + ', ' + hexToRgb('#000').b + ')'}

и заменить его на что-то вроде:

rgbValue={ 'rgb=(' + ...hexToRgb('#000') + ')'}

Надеясь, что это вернет значения r,g,b от объекта и конечный результат будет:

rgbValue={'rgb=(0,0,0)'}

Однако это не работает, как ожидалось. Я не знаю, если это проблема логики c или ошибка Ситнакс. Я новичок в использовании оператора распространения, поэтому я не слишком знаком с ним, но есть ли способ добиться этого с помощью моей текущей настройки?

JS функция, используемая для отображения того, что возвращается:

function hexToRgb(hex) {
  // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
    return r + r + g + g + b + b;
  });
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  // return rgb values as properties on an object
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

Ответы [ 3 ]

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

Я не знаю, является ли это ошибкой logi c или ошибкой синтаксиса.

Это синтаксическая ошибка. Вы можете использовать распространение только в тех местах, где определено распространение (это часть того, почему это нотация / синтаксис, а не оператор).

Если вы хотите использовать результат hexToRgb в конкатенации строк, у вас есть несколько вариантов:

  1. Пусть он вернет строку.

  2. Пусть он вернет массив и вызовет .join(",") для этого массива; убедитесь, что массив имеет порядок r, g, b.

    rgbValue={'rgb=(' + formatRgb(hexToRgb('#000')) + ')'}
    
  3. Пусть он возвращает объект (всегда, иногда не null) и использует Object.values(hexToRgb('#000')).join(","). Убедитесь, что объект создан в порядке r, g, b (у вас есть), и что этот код работает только на современном JavaScript движке. Порядок свойств объекта был определен только для Object.values очень недавно (изменение, которое будет в ES2020); до этого, хотя для некоторых операций существовал порядок, для Object.values и некоторых других он не требовался. Но современные движки уже реализуют порядок, который был определен, так что до тех пор, пока вам не придется переносить данные для IE11 или чего-то в этом роде ...

    // See caveats in the text
    rgbValue={'rgb=(' + Object.values(hexToRgb('#000')).join(",") + ')'}
    
  4. Имеют функцию форматирования вы передаете результат в

    rgbValue={'rgb=(' + formatRgb(hexToRgb('#000')) + ')'}
    

Я не до конца понимаю эту строку

Это синтаксическая ошибка. Вы можете использовать распространение только в тех местах, где определяется распространение (это часть того, почему это нотация / синтаксис, а не оператор).

Но я посмотрю на это.

Достаточно справедливо, это очень краткое изложение чего-то сложного. Просто FWIW:

... не оператор. Оператор имеет операнды (например, параметры функции) и одно значение результата (например, возвращаемое значение функции) и может использоваться практически везде, где ожидается выражение. ... не является оператором и не может быть, потому что у него нет единственного значения результата. Вместо этого ... определяется как первичный синтаксис с пятью значениями:

  1. Итерируемое распространение : ... в списке аргументов массива или аргумента функции распределяет значения итерируемого как дискретные записи для нового массива или дискретные аргументы для вызова функции.

const source = [1, 2, 3, 4];

// In an array literal
const dest = [...source, 5, 6];
console.log(dest); // [1, 2, 3, 4, 5, 6]

function example1(a, b, c, d) {
    console.log(a, b, c, d); // 1 2 3 4
}

// In a function argument list
example1(...source);
Параметр rest : ... перед последним объявленным параметром в списке параметров функции помечает «параметр rest», который получит все аргументы, предоставленные из этой точки, в виде массива.

function example2(a, b, ...rest) {
    console.log(`a = ${a}, b = ${b}, rest = ${JSON.stringify(rest)}`);
}

example2(1, 2, 3, 4); // a = 1, b = 2, c = [3,4]
Распределение свойств : ... в литерале объекта распространяет собственные перечисляемые свойства объекта на отдельные свойства для создаваемого объекта.

const source = {a: 1, b: 2, c: 3};

const dest = {...source, d: 4, e: 5};
console.log(dest); // {a: 1, b: 2, c: 3, d: 4, e: 5}
Итерируемый остаток (деструктурирование), обратное итерируемое распространение в литерале массива: ... в шаблоне деструктуризации массива обозначает цель, которая получит "остаток" итеративных записей, не использованных другие цели в шаблоне (в виде массива).

const source = [1, 2, 3, 4];

const [a, b, ...rest] = source;
console.log(`a = ${a}, b = ${b}, rest = ${JSON.stringify(rest)}`); // a = 1, b = 2, rest = [3,4]
Остаток свойства (деструктуризация), обратное распространение свойства: ... в шаблоне деструктуризации объекта помечает цель, которая получит «остаток» свойств, не использованных другими целями в шаблоне (как объект).

const source = {a: 1, b: 2, c: 3};

const {a, ...rest} = source;
console.log(a);    // 1
console.log(rest); // {b: 2, c: 3}

Вне этих значений значение ... не определено и поэтому вызывает синтаксическую ошибку.

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

Вместо массива возврата

function hexToRgb(hex) {
  // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
    return r + r + g + g + b + b;
  });
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  // return rgb values as properties on an object
  return result ? [
    parseInt(result[1], 16),
    parseInt(result[2], 16),
    parseInt(result[3], 16)
  ] : [];
}

rgbValue='rgb=(' + hexToRgb('#000').join(',') + ')';
// rgb=(0,0,0)
0 голосов
/ 22 января 2020

Во-первых, это ошибка, потому что оператор распространения работает только для итераций (например, массивов), а не для объектов (если вы не создаете объект).

Во-вторых, если вам нужно обойти это сначала преобразуйте значения объекта в массив, например (...Object.values(myHex)), это приведет к неожиданным результатам, поскольку записи объекта неупорядочены. Т.е. нет никакой гарантии, что r наступит раньше g.

IMO, ваш текущий код достаточно ясен. Но если вы действительно хотите использовать оператор распространения, вы можете изменить hexToRgb, чтобы он возвращал упорядоченный массив result.map(v => parseInt(v, 16))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...