天天看点

11 个让你成为忍者开发者的 JavaScript One-Liner

11 个让你成为忍者开发者的 JavaScript One-Liner

英文 | https://betterprogramming.pub/11-javascript-one-liners-thatll-make-you-a-ninja-developer-4a15ac592669

翻译 | 杨小二

比尔盖茨说:“我选择一个懒惰的人来做艰苦的工作。因为懒惰的人会找到一种简单的方法来做到这一点。”

作为开发人员,我们通常会尽量避免编写长行代码。我的意思是没有人愿意用 500行代码来写一个50行就能实现的相同功能。

成为一名忍者开发者还意味着找到一种简单的方法来完成一项任务——编写 50 行代码而不是编写 500 行代码。Ninja 开发人员也喜欢使用 one-liners。他们拥有将长行代码转换为单行代码的技能。

今天,我将与你一起来学习这 11 个 JavaScript 单行代码之,很可能,比尔·盖茨可能想聘请你作为开发人员。

1、找到最短的长度

使用此函数,你将找到给定字符串中单词的最短长度。我们可以从一些函数中获得帮助,例如 split()、sort() 和 pop()。

const findShort = (s) => s.split(' ').sort((a, b) => b.length - a.length).pop().length;
console.log(findShort("It's an amazing day to code"));
// Result: 2
console.log(findShort("Lorem Ipsum"));
// Result: 5      

2、返回单词的中间字符

此函数返回单词的中间字符。如果你给这个函数一个奇数长度的单词,它会返回中间的字符。但是,如果给单词的长度为偶数,它将返回中间的两个字符。

const getMiddle = s => s.substring(Math.ceil(s.length/2)-1, Math.floor(s.length/2)+1);
console.log(getMiddle("Amazing"));
// Result: z
console.log(getMiddle("Rubber"));
// Result: bb      

3、将零移到最后

函数 moveZeros() 接受一个数组并将所有零移动到末尾。在这样做的同时,它还保留了其他元素的顺序。

let moveZeros = (arr) => arr.filter(i => i !== 0).concat(arr.filter(i => i === 0));
console.log(moveZeros([false, 1, 0, true, 1, 2, 5, 0, 1, 3, "Ajax"]));
// Result: [false, 1, true, 1, 2, 5, 1, 3, "Ajax", 0, 0]      

4、数组差异

如果你想从另一个数组中减去一个数组并返回差值,这是一个很好的方法。它保留结果列表中其他元素的顺序。

var array_diff = (a, b) => a.filter(item => b.indexOf(item) < 0)
console.log(arrayDiff([1, true, "1", "2", 2, 5, 3], [false, "8", 3, 1]));
// Result: [true, "1", "2", 2, 5]
console.log(arrayDiff([1, true, "1", "2"], [1, true, "1", "2", 3]));
// Result: []      

5、消除字符串中的元音

使用 removeVowels() 函数,你可以删除给定字符串中的元音。

const eliminateVowels = s => s.replace(/[aeiou]/gi, '');
console.log(eliminateVowels("The Master Splinter Developer"));
// Result: Th Mstr Splntr Dvlpr      

6、SOS

使用此函数,你可以检查给定字符串中的“O”和“S”的数字是否相同。

const SOS = s => s.replace(/o/ig, '').length == s.replace(/s/ig, '').length;
console.log(SOS("SOS"));
// Result: False
console.log(SOS("So so"));
// Result: True
console.log(SOS(""));
// Result: True      

7、按降序排列的整数位数

你可以使用此函数返回一个整数,其数字按降序排列。如果你为该函数提供非负整数会有所帮助。

该函数会将数字重新排列为整数中可能的数字的最高数字。

在这个函数中,我们将得到一些内置函数的帮助,它们是 parseInt()、toString()、split()、sort()、reverse() 和 join()。

const descendingOrder = n => parseInt(n.toString().split("").sort().reverse().join(""));
console.log(descendingOrder(234782)); // Result: 874322
console.log(descendingOrder(10010101010)); // Result: 11111000000
console.log(descendingOrder(123456)); // Result: 654321      

8、找出出现奇数次的整数

此函数将帮助你找到在给定数组中出现奇数次的整数。这个功能有一个不好的地方。如果你给出多个出现奇数次的整数,它将不起作用。

const findOdd = (a) => a.reduce((a, b) => a ^ b);
console.log(findOdd([1, 2, 2, 1])); // Result: 0
console.log(findOdd([1, 2, 2, 1, 2, 3, 3])); // Result: 2
console.log(findOdd([1, 2, 3, 4])); // Result: 4 -> Not working      

9、求给定数组的最大子数组和

使用此函数,你可以找到给定数组的最大子数组和。这是一个需要解决的大问题。解决起来并不容易。尤其是想用单线方案来实现这个功能,就更具挑战性了。但是,你可以从内置函数 reduce() 获得帮助。

const maxSequence = (a,sum=0) => a.reduce((max,v) => Math.max(sum = Math.max(sum + v, 0), max), 0);
console.log(maxSequence([1,2,3,4])); // Result: 10
console.log(maxSequence([1,2,3,4,-8])); // Result: 10
console.log(maxSequence([1,-2,3,-2,5,-1,3,-9,1,6])); // Result: 8      

10、第二个数组的字符串是否包含第一个数组的字符串

你可以使用此功能来回答上述问题。此函数将返回一个按字典顺序排列的第一个数组字符串的排序数组,这些字符串是第二个数组字符串的子字符串。

const inArray = (arr1, arr2) => arr1.filter(item => new RegExp(item).test(arr2)).sort()
console.log(inArray(["Donald", "Strong", "The"],["Stronger, "More", "They"]));
// Result: ["Strong", "The"]
console.log(inArray(["Stronger", "More", "They"],["Donald, "Strong", "The"]));
// Result: []
console.log(inArray(["Novice"],["NOVICE"]));
// Result: []      

11、找到前一个数的倍数,3的倍数

此函数删除最后一位数字,直到找到一个是 3 的倍数的数字。如果给定的参数已经是3的倍数,它将返回它。如果不是3的倍数的数字集合,它将返回 null。

给自己举一个很好的例子,如果整数的每个数字之和被3除,你可以认为3整除一个整数。

const f = prevMultOfThree = n => n ? n % 3 ? f(n/10 |0) : n : null
console.log(prevMultOfThree(3)); // Result: 3
console.log(prevMultOfThree(36)); // Result: 36
console.log(prevMultOfThree(1236)); // Result: 1236
console.log(prevMultOfThree(5245)); // Result: null
console.log(prevMultOfThree(4552)); // Result: 45
console.log(prevMultOfThree(11)); // Result: null      

结论

今天,我与你分享的 11 个 JavaScript 单行程序。其中一些可能对你来说很容易,而另一些则让你进行头脑风暴。学习这些 one-liners 中的内置函数也可以给你一些编程灵感。