.map 对象标题数组到基于票数的新数组
Posted
技术标签:
【中文标题】.map 对象标题数组到基于票数的新数组【英文标题】:.map array of object titles into a new array based on number of votes 【发布时间】:2019-03-23 15:44:05 【问题描述】:我有一个看起来像这样的对象数组。
array = [
title: Title1,
votes: 2,
,
title: Title2,
votes: 1,
,
title: Title3,
votes: 1,
,
];
我想要做的是使用 .map 将标题推送到一个新数组中,但基于该对象的投票数。
对于这个例子,它看起来像这样。
newArray = [Title1, Title1, Title2, Title3]
在我使用 React 时,使用 .map 是最好的方法。
【问题讨论】:
【参考方案1】:不,Array.prototype.map 不是最好的选择。当您想要一个与原始数组长度相同的新数组时,它很有用。你可以用Array.prototype.reduce实现你想做的事情:
const array = [ title: 'Title1', votes: 2 , title: 'Title2', votes: 1 , title: 'Title3', votes: 1 ];
const result = array.reduce( (res, el) => res.concat( Array( el.votes ).fill( el.title ) ), [] );
console.log( result );
目前还有一个proposal for an Array.prototype.flatMap 函数非常适合您的情况,但还没有太多浏览器支持:
const array = [ title: 'Title1', votes: 2 , title: 'Title2', votes: 1 , title: 'Title3', votes: 1 ];
const result = array.flatMap( el => Array( el.votes ).fill( el.title ) );
console.log( result );
【讨论】:
谢谢,这正是我想要做的。感谢您提供有关附加数组功能的信息,我将不得不检查一下。【参考方案2】:我会先使用 array.sort(),然后使用 array.map() 来只返回像这样的所需属性(原始数组保持不变,不会发生突变):
var array = [ title: 'Title1', votes: 2 , title: 'Title2', votes: 1 , title: Title3', votes: 1 ];
const result = array.sort((a, b) => a.votes > b.votes).map((item) => item.title)
console.log(result)
具有相同票数的标题按字典顺序排序。
【讨论】:
【参考方案3】:您可以像这样将 map 与 fill 与 concat 结合起来:
Array.prototype.concat(...array.map(elem => new Array(elem.votes).fill(elem.title)))
结果
["Title1", "Title1", "Title2", "Title3"]
【讨论】:
【参考方案4】:Array.map
每个元素只返回一个值。你可能想要Array.reduce
:
let newArray = array.reduce((accum, curValue) =>
for (let i = 0; i < curValue.votes; i++)
accum.push(curValue.title);
return accum;
, []);
【讨论】:
【参考方案5】:您可以通过将votes
作为推入title
的while 循环的计数来减少数组。
var array = [ title: 'Title1', votes: 2 , title: 'Title2', votes: 1 , title: 'Title3', votes: 1 ],
result = array.reduce((r, title, votes ) =>
while (votes--) r.push(title);
return r;
, []);
console.log(result);
【讨论】:
【参考方案6】:您可以将map
与concat
方法一起使用并传播语法。
let array = [ title: 'Title1', votes: 2 , title: 'Title2', votes: 1 , title: 'Title3', votes: 1 ];
let result = [].concat(...array.map((title, votes) => Array(votes).fill(title)));
console.log(result)
【讨论】:
以上是关于.map 对象标题数组到基于票数的新数组的主要内容,如果未能解决你的问题,请参考以下文章