【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
在PHP中,您可以...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
也就是说,有一个函数可以让您通过传递上下限来获得一定范围的数字或字符。
为此,JavaScript是否内置任何内置功能? 如果没有,我将如何实施?
#1楼
号码
[...Array(5).keys()];
=> [0, 1, 2, 3, 4]
角色迭代
String.fromCharCode(...[...Array('D'.charCodeAt(0) - 'A'.charCodeAt(0) + 1).keys()].map(i => i + 'A'.charCodeAt(0)));
=> "ABCD"
迭代
for (const x of Array(5).keys()) {
console.log(x, String.fromCharCode('A'.charCodeAt(0) + x));
}
=> 0,"A" 1,"B" 2,"C" 3,"D" 4,"E"
作为功能
function range(size, startAt = 0) {
return [...Array(size).keys()].map(i => i + startAt);
}
function characterRange(startChar, endChar) {
return String.fromCharCode(...range(endChar.charCodeAt(0) -
startChar.charCodeAt(0), startChar.charCodeAt(0)))
}
作为键入函数
function range(size:number, startAt:number = 0):ReadonlyArray<number> {
return [...Array(size).keys()].map(i => i + startAt);
}
function characterRange(startChar:string, endChar:string):ReadonlyArray<string> {
return String.fromCharCode(...range(endChar.charCodeAt(0) -
startChar.charCodeAt(0), startChar.charCodeAt(0)))
}
lodash.js _.range()
函数
_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
String.fromCharCode(..._.range('A'.charCodeAt(0), 'D'.charCodeAt(0) + 1));
=> "ABCD"
没有库的旧的非es6浏览器:
Array.apply(null, Array(5)).map(function (_, i) {return i;});
=> [0, 1, 2, 3, 4]
console.log([...Array(5).keys()]);
谢谢。
(ES6归功于nils petersohn和其他评论者)
#2楼
使用除IE11之外的所有浏览器都支持的 Harmony生成 器 :
var take = function (amount, generator) {
var a = [];
try {
while (amount) {
a.push(generator.next());
amount -= 1;
}
} catch (e) {}
return a;
};
var takeAll = function (gen) {
var a = [],
x;
try {
do {
x = a.push(gen.next());
} while (x);
} catch (e) {}
return a;
};
var range = (function (d) {
var unlimited = (typeof d.to === "undefined");
if (typeof d.from === "undefined") {
d.from = 0;
}
if (typeof d.step === "undefined") {
if (unlimited) {
d.step = 1;
}
} else {
if (typeof d.from !== "string") {
if (d.from < d.to) {
d.step = 1;
} else {
d.step = -1;
}
} else {
if (d.from.charCodeAt(0) < d.to.charCodeAt(0)) {
d.step = 1;
} else {
d.step = -1;
}
}
}
if (typeof d.from === "string") {
for (let i = d.from.charCodeAt(0); (d.step > 0) ? (unlimited ? true : i <= d.to.charCodeAt(0)) : (i >= d.to.charCodeAt(0)); i += d.step) {
yield String.fromCharCode(i);
}
} else {
for (let i = d.from; (d.step > 0) ? (unlimited ? true : i <= d.to) : (i >= d.to); i += d.step) {
yield i;
}
}
});
例子
采取
范例1。
take
只需要尽可能多的,因为它可以得到
take(10, range( {from: 100, step: 5, to: 120} ) )
退货
[100, 105, 110, 115, 120]
示例2
to
不neccesary
take(10, range( {from: 100, step: 5} ) )
退货
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
takeAll
范例3。
from
不必要
takeAll( range( {to: 5} ) )
退货
[0, 1, 2, 3, 4, 5]
范例4。
takeAll( range( {to: 500, step: 100} ) )
退货
[0, 100, 200, 300, 400, 500]
示例5
takeAll( range( {from: 'z', to: 'a'} ) )
退货
["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a"]
#3楼
简单范围功能:
function range(start, stop, step) {
var a = [start], b = start;
while (b < stop) {
a.push(b += step || 1);
}
return a;
}
要合并BitInt数据键入一些检查可以包括在内,以确保所有的变量都相同typeof start
:
function range(start, stop, step) {
var a = [start], b = start;
if (typeof start == 'bigint') {
stop = BigInt(stop)
step = step? BigInt(step): 1n;
} else
step = step || 1;
while (b < stop) {
a.push(b += step);
}
return a;
}
#4楼
这是我的2美分:
function range(start, count) {
return Array.apply(0, Array(count))
.map((element, index) => index + start);
}
#5楼
对各种范围函数做了一些研究。 检验一下jsperf做这些功能的不同方法的比较 。 当然不是一个完美或详尽的清单,但应该有所帮助:)
获胜者是...
function range(lowEnd,highEnd){
var arr = [],
c = highEnd - lowEnd + 1;
while ( c-- ) {
arr[c] = highEnd--
}
return arr;
}
range(0,31);
从技术上讲,它不是在Firefox上最快的,但是在chrome上疯狂的速度差异(imho)弥补了这一点。
同样有趣的观察是这些数组函数的chrome比firefox快多少。 Chrome至少快4到5倍 。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3145710