我正在尝试使用数组缩减功能返回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'}]
答案 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
尽管在进行代码查询时逗号运算符可能很有用,但在尝试编写良好的可读代码时可能不应该使用逗号。