首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用map时使用spread运算符扩展数组

使用map时使用spread运算符扩展数组
EN

Stack Overflow用户
提问于 2016-02-29 17:04:50
回答 3查看 9.1K关注 0票数 4

我不确定这是否是一种正确的方法,但我很好奇能否做到这一点。我有一个对象,我需要从它创建一个数组,键是项目,值标识它在数组中重复的次数。

代码语言:javascript
复制
const arrayInstructions = {
  'm': 5,
  's': 5,
  'p': 5
}

这应该使['m','m','m','m','m','s','s' ... ]

这是工作方法:

代码语言:javascript
复制
var array = []
Object.keys(arrayInstructions).forEach(function (agenda) {
  array = array.concat( _.fill(Array(arrayInstructions[agenda]), agenda) )
})

能否以这种方式进行:

代码语言:javascript
复制
var deck = Object.keys(streamDeck).map(function (agenda) {
  var partial = _.fill(Array(streamDeck[agenda]), agenda)
  return ...partial // I know this is wrong
})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-29 17:45:23

您可以使用Array.prototype.concat上的扩展来构建最终的数组:

代码语言:javascript
复制
const arrayInstructions = { 'm': 5, 's': 5, 'p': 5 };

// This works because Array.prototype behaves like an empty list here
const deck = Array.prototype.concat(
  ..._.map(arrayInstructions, (times,agenda) => _.times(times, _=>agenda)) 
);

log(JSON.stringify(deck));

function log(x) { document.getElementsByTagName('pre')[0].appendChild(document.createTextNode(x)); }
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.5.1/lodash.js"></script>
<pre></pre>

更新

考虑到Bergi的建议,该版本更短,并且不依赖于Array.prototype在数组上下文中的行为:

代码语言:javascript
复制
const deck = [].concat(..._.map(arrayInstructions,
    (times,agenda) => _.times(times, _=>agenda)
));
票数 2
EN

Stack Overflow用户

发布于 2016-02-29 17:34:09

没有充分的理由在这里使用传真机吗?

在它最简单的形式中,扩展运算符允许您使用一个数组,其中需要多个“元素”或参数,例如

代码语言:javascript
复制
var part = [2, 3];
var arr  = [1, ...part, 4]; // [1,2,3,4]

这确实很有用,但是您正在填充数组并将它们连接在一起,使用concat似乎更合适,但是如果使用apply并返回映射,则可以将其限制为对concat的单个调用。

代码语言:javascript
复制
"use strict"

const arrayInstructions = {
  'm': 5,
  's': 1,
  'p': 2
}

var deck = [].concat.apply([], Object.keys(arrayInstructions).map(function(k) { 
    return new Array(arrayInstructions[k]).fill(k) 
}));


//output
document.body.innerHTML = '<pre>' + JSON.stringify(deck, 0, 4) + '</pre>';

票数 2
EN

Stack Overflow用户

发布于 2016-02-29 18:24:17

由于Bergi said JS没有concatMap,但您可以手动定义此功能:

代码语言:javascript
复制
function concatMap(array, func, thisArg) {
  return [].concat.apply([], [].map.call(array, func, thisArg));
}
concatMap(
  Object.keys(arrayInstructions),
  k => new Array(arrayInstructions[k]).fill(k)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35705284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档