es6 Array Сокращение использования функции и разделения строк - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь использовать функцию уменьшения массива, чтобы вернуть двумерный массив объектов. Ввод значений через запятую. Первая строка строки используется в качестве строки заголовка. Я анализирую решение, и я не понимаю обозначения. В частности, я не понимаю "=> ((obj [title] = Значения [index]), obj), {}) "в приведенном ниже коде. Мне нужно, чтобы кто-то объяснил мне это. Мне кажется, что мы инициализируем obj, чтобы быть объектом. После этого я Я потерялся.

const CSV_to_JSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
  return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
  const values = v.split(delimiter);
  return titles.reduce((obj, title, index) => ((obj[title] = 
   values[index]), obj), {});
});
};

console.log(CSV_to_JSON('col1,col2\na,b\nc,d')); // [{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}];
console.log(CSV_to_JSON('col1;col2\na;b\nc;d', ';')); // [{'col1': a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}]

1 Ответ

0 голосов
/ 16 января 2019

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

.reduce там

return titles.reduce((obj, title, index) => ((obj[title] = 
 values[index]), obj), {});

эквивалентно

return titles.reduce((obj, title, index) => {
  obj[title] = values[index];
  return obj;
}, {});

что имеет гораздо больший смысл - он превращает массив заголовков (например, ['foo', 'bar']) и массив значений (например, ['fooVal', 'barVal']) и использует .reduce для преобразования их в один объект, { foo: 'fooVal', bar: 'barVal' }.

Первым аргументом для обратного вызова .reduce является начальное значение аккумулятора (второй аргумент .reduce) или значение, которое было возвращено на последней итерации - приведенный выше код передает {} в качестве начального значения, присваивает свойство объекту и возвращает объект на каждой итерации..reduce - это обычно наиболее подходящий метод для превращения массива в объект, но если вы более знакомы с forEach, код эквивалентен

const obj = {};
titles.forEach((title, index) => {
  obj[title] = values[index];
});
return obj;

Хотя оператор запятых может быть полезен при игре в код, это, вероятно, не то, что следует использовать при попытке написать хороший читаемый код.

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