使用标题破坏
Posted
技术标签:
【中文标题】使用标题破坏【英文标题】:Destruct using titles 【发布时间】:2020-09-23 14:14:45 【问题描述】:我已经用 destructing 回答了几个问题,我只是想把这个问题更上一层楼
我不想在这个例子中使用 reduce,而是尽可能地使用纯破坏
所以数据的第一行包含对象的属性名称,我怎样才能使用它来干燥
即我希望
const obj = data.slice(1).map((titles) => ( titles ) )
或类似
所以这行得通,但我又错过了一步:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0]; // not used below but I want to use it
const obj = data.slice(1).map(([fruits,frozen,fresh,rotten]) => ( fruits,frozen,fresh,rotten ) )
console.log(obj)
【问题讨论】:
使用数组的reduce方法创建对象。 为什么这个问题被否决了? 【参考方案1】:你可以使用reduce
,但你不能真正破坏......
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const titles = data[0];
const obj = data.slice(1).map((row) => titles.reduce((agg, cur, index) =>
agg[cur] = row[index];
return agg;
, ));
console.log(obj)
【讨论】:
谢谢 - 有趣的例子 - 我真的不想减少【参考方案2】:您可以映射对象的条目。
const
data = [["fruits", "frozen", "fresh", "rotten"], ["apples", 884, 494, 494], ["oranges", 4848, 494, 4949], ["kiwi", 848, 33, 33]],
mapWith = keys => values => Object.fromEntries(keys.map((k, i) => [k, values[i]])),
getArray = ([keys, ...data]) => data.map(mapWith(keys)),
array = getArray(data);
console.log(array);
.as-console-wrapper max-height: 100% !important; top: 0;
旧的更简单的例子
const data = [
["fruits", "frozen", "fresh", "rotten"],
["apples", 884, 494, 494],
["oranges", 4848, 494, 4949],
["kiwi", 848, 33, 33]
]
const titles = data[0];
const obj = data.slice(1).map(
arr => Object.fromEntries(
titles.map(
(t, i) => [t, arr[i]]
)
)
);
console.log(obj);
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
Okeee,现在我必须弄清楚你在那里做了什么;))) 我保存了第一个,因为我想通了。然后你稍微提高了赌注。新示例的性能如何?看起来处理很多 仅此而已。它只是拆分数组并获取键的第一行,其余的作为值进行迭代。 我不明白两个粗箭头的语法:mapWith = keys => values =>
这只是对参数的一个闭包,并在最后返回一个带有另一个参数的函数。【参考方案3】:
您可以创建zip
的柯里化版本,它类似于Object.fromEntries
,只是它不采用对,而是基于索引形成键列表以及值和对的列表:
zip(['a','b'], [1,2]);
//=> a: 1, b: 2)
因为它是 curried,所以您可以在地图中使用它并避免硬编码标题:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
]
const zip =
keys =>
values =>
Object.fromEntries
( keys.map((k, i) => [k, values[i]])
);
const from_csv =
([titles, ...rows]) =>
rows.map(zip(titles));
console.log(
from_csv(data)
);
【讨论】:
谢谢 - 有趣的例子 @mplungjan 因为你似乎不喜欢Array#reduce
,所以我修改了zip
函数以使用Object.fromEntries
。这样地图是“本地”构建的。除非有很多对,否则不太可能引起注意。但是你去;)【参考方案4】:
const data = [
["fruits","frozen","fresh","rotten"],
["apples",884,494,494],
["oranges",4848,494,4949],
["kiwi",848,33,33]
];
const [titles, ...rest] = data;
const obj = rest.map((xs) =>
const o = ;
xs.forEach((x,i) => o[titles[i]] = x);
return o;
);
console.log(obj);
【讨论】:
是的,这是正常的。它也可以重写为reduce以上是关于使用标题破坏的主要内容,如果未能解决你的问题,请参考以下文章