es6 Array Reduce函数和字符串拆分用法

时间:2019-01-16 01:14:40

标签: javascript arrays string ecmascript-6

我正在尝试使用数组缩减功能返回2D对象数组。输入是逗号分隔的值。字符串的第一行用作标题行。我正在分析解决方案,但我不理解这种表示法。具体来说,我不理解“ =>(((obj [title] =        下面代码中的values [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 :(得分:2)

这是对()逗号操作符的滥用,它使用逗号分隔的表达式列表,评估第一个表达式,将其丢弃,然后整个(...)解析为最终表达。通常只能在自动缩小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的第二个参数)或上次迭代返回的值-上面的代码传递了{{1} }作为初始值,为该对象分配一个属性,并在每次迭代时返回该对象。 {} 通常是用于将数组变成对象的最合适方法,但是如果您更熟悉.reduce,则代码等同于

forEach

尽管在进行代码查询时逗号运算符可能很有用,但在尝试编写良好的可读代码时可能不应该使用逗号。