.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】:

您可以将mapconcat 方法一起使用并传播语法。

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 对象标题数组到基于票数的新数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从对象传递到javascript中的新数组?

类似对象 .map() 的 JavaScript 数组

将对象属性的所有值提取到 Typescript 中的新数组 [重复]

将带有值的新键添加到嵌套对象数组中

如何创建对象的新实例并将其传递到数组 SwiftUI

C++ 将新的类对象添加到数组中的新位置