javascript 中这段代码的等价物是什么
what is the equivalent of this code in javascript
我正在尝试阅读一些用 ruby 编写的代码。我熟悉 JavaScript 并想了解代码在 javascript.
中的含义
代码如下:
def two_d_translate(arr)
new_arr = []
arr.each do |subArray|
ele = subArray[0]
num = subArray[1]
num.times { new_arr << ele }
end
return new_arr
end
该代码的目的是通过将字符串打印与其旁边的数字(每个子数组中的第二个元素)一样多的次数,将二维数组转换为一维数组。
我用它来尝试模仿它,但我想知道是否还有其他更好的东西。
function two_d_translate(arr) {
let newArr = '';
let array = [];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j += 2) {
let ele = arr[i][j];
let num = arr[i][j+1];
if (num === 0){
continue;
}
array[i] = Array(num).fill(ele);
}
}
newArr = array.toString().split(',');
return newArr;
}
这对于这个测试样本来说似乎很酷。
arr_1 = [
['boot', 3],
['camp', 2],
['program', 0]
]
console.log(two_d_translate(arr_1));
它将产生预期的输出
[ 'boot', 'boot', 'boot', 'camp', 'camp' ]
但在这种情况下不会
arr_1=[
['boot', 3],
['camp', 0],
['program', 2]
]
这会导致不希望的输出,即
[ 'boot', 'boot', 'boot', '', 'program', 'program' ]
如果你的环境允许扩展语法,你可以这样做
const arr_1 = [
['boot', 3],
['camp', 0],
['program', 2]
]
const result = arr_1.reduce((acc, [string, times]) => [...acc, ...Array(times).fill(string)], []);
console.log(result); // [ 'boot', 'boot', 'boot', 'program', 'program' ]
诀窍是使用 flatMap
将单独的运行连接在一起:
let translate = a => a.flatMap(([s, n]) => Array(n).fill(s))
console.log(translate([
['boot', 3],
['camp', 2],
['program', 1]
]))
如果您的目标还不支持 flatMap
,等效的 ES6 习语是 [].concat(...map)
:
let translate = a => [].concat(...a.map(([s, n]) => Array(n).fill(s)))
console.log(translate([
['boot', 3],
['camp', 2],
['program', 1]
]))
根据经验,将 "many things" 转换为 "many things" 时使用 map/flatMap
,将 "many things" 转换为 "one thing" 时使用 reduce
.
将您的数组缩减为一个数组
使用 Array#reduce
you are able to iterate over the entire array whilst pushing/concatenating the last calculation into the final result. This, in combination with Array.fill
, allows us to create the correct amount, sometimes 0, of the string. And with Array#concat
我们可以轻松地将此 3D 数组转换为 2D 数组。这是一个例子:
function translateTo2D(arr) {
return arr.reduce((result, [name, count]) =>
result.concat(Array(count).fill(name)),
[]);
}
const arr = [['a', 2], ['b', 0], ['c', 1]];
console.log(translateTo2D(arr));
我正在尝试阅读一些用 ruby 编写的代码。我熟悉 JavaScript 并想了解代码在 javascript.
中的含义代码如下:
def two_d_translate(arr)
new_arr = []
arr.each do |subArray|
ele = subArray[0]
num = subArray[1]
num.times { new_arr << ele }
end
return new_arr
end
该代码的目的是通过将字符串打印与其旁边的数字(每个子数组中的第二个元素)一样多的次数,将二维数组转换为一维数组。
我用它来尝试模仿它,但我想知道是否还有其他更好的东西。
function two_d_translate(arr) {
let newArr = '';
let array = [];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j += 2) {
let ele = arr[i][j];
let num = arr[i][j+1];
if (num === 0){
continue;
}
array[i] = Array(num).fill(ele);
}
}
newArr = array.toString().split(',');
return newArr;
}
这对于这个测试样本来说似乎很酷。
arr_1 = [
['boot', 3],
['camp', 2],
['program', 0]
]
console.log(two_d_translate(arr_1));
它将产生预期的输出
[ 'boot', 'boot', 'boot', 'camp', 'camp' ]
但在这种情况下不会
arr_1=[
['boot', 3],
['camp', 0],
['program', 2]
]
这会导致不希望的输出,即
[ 'boot', 'boot', 'boot', '', 'program', 'program' ]
如果你的环境允许扩展语法,你可以这样做
const arr_1 = [
['boot', 3],
['camp', 0],
['program', 2]
]
const result = arr_1.reduce((acc, [string, times]) => [...acc, ...Array(times).fill(string)], []);
console.log(result); // [ 'boot', 'boot', 'boot', 'program', 'program' ]
诀窍是使用 flatMap
将单独的运行连接在一起:
let translate = a => a.flatMap(([s, n]) => Array(n).fill(s))
console.log(translate([
['boot', 3],
['camp', 2],
['program', 1]
]))
如果您的目标还不支持 flatMap
,等效的 ES6 习语是 [].concat(...map)
:
let translate = a => [].concat(...a.map(([s, n]) => Array(n).fill(s)))
console.log(translate([
['boot', 3],
['camp', 2],
['program', 1]
]))
根据经验,将 "many things" 转换为 "many things" 时使用 map/flatMap
,将 "many things" 转换为 "one thing" 时使用 reduce
.
将您的数组缩减为一个数组
使用 Array#reduce
you are able to iterate over the entire array whilst pushing/concatenating the last calculation into the final result. This, in combination with Array.fill
, allows us to create the correct amount, sometimes 0, of the string. And with Array#concat
我们可以轻松地将此 3D 数组转换为 2D 数组。这是一个例子:
function translateTo2D(arr) {
return arr.reduce((result, [name, count]) =>
result.concat(Array(count).fill(name)),
[]);
}
const arr = [['a', 2], ['b', 0], ['c', 1]];
console.log(translateTo2D(arr));