使用Map-Reduce返回一个经过修改的字符串数组

时间:2017-04-28 14:46:11

标签: javascript

我正在学习地图&减少,但我很难理解如何利用这些方法来解决问题。

例如,

创建一个带数字的函数,并返回一个字符串数组,其中包含每个数字处截止的数字。

420应该返回[" 4"," 42"," 420"]

我的老方法:

function createArrayOfTiers(num) {
    var numArr = num.toString().split('');
    var output = [];
    for(var i = numArr.length-1; i>=0; i--) {
        output.unshift(numArr.join('');
        numArr.pop();
        }
    return output;
    }

尝试使用map-reduce组合:

function createArrayOfTiers(num) {
    var numArr = num.toString().split('');
    return numArr.map(function(element) {
    var newElement = numArr.reduce(function(acc, val) {
        return acc + val;
    });
    numArr.splice(element, 1);
    return newElement;
    });
}

3 个答案:

答案 0 :(得分:1)

你使用了两个循环,但显然它只能用一个循环完成。

function n(num) {
  let res = (""+num).split('').map((_,i) => (""+num).slice(0, i+1));
  return res;
}

console.log(n(420));
console.log(n(13579));

一衬垫。

const n = num => (""+num).split('').map((_,i) => (""+num).slice(0, i+1));

console.log(n(420));
console.log(n(13579));

答案 1 :(得分:0)

我不认为这些是mapreduce的良好用例,但这里有:

var numArr = [4,2,0];
var result = numArr.map(e => numArr.join(''))  // now ["420", "420", "420"]
                   .map((arr, i) => arr.substring(0, i+1)) // now ["4", "42", "420"]
console.log(result);

我们首先用连接成字符串的整个(未修改的)数组替换数组的每个元素,然后根据它们在外部数组中的位置对每个字符串进行子字符串。

虽然未使用reduce,但隐藏在其中的缩减:join会将[4, 2, 0]缩减为"420"

  

我正在学习地图&减少,但我很难理解如何利用这些方法来解决问题。

将关联映射到源数组的每个值的映射函数提供的新值:如果您有一个[x, y, z]数组,一个映射函数f(x)=x+1,则使用该函数映射数组的结果将是[x+1, y+1, z+1]

我认为减少意味着将数组“减少”为原始类型,尽管我可能会弄错。如果您有[x, y, z]数组并使用加法运算将其减少,则结果将为x+y+z

答案 2 :(得分:0)

正如其他人所说,这个问题似乎并不是mapreduce函数的最佳用例。

  1. map函数在参数中提供elementindexarray信息。利用这些,您可以迭代应用reduce函数所需的元素。

  2. 语句var arrayToIterate = arr.slice(0,i+1);有助于实现上述数组迭代。

  3. 完整代码:

    
    
    function createArrayOfTiers(num) {
        var numArr = num.toString().split('');
        return numArr.map(function(element, i, arr) {
    	var arrayToIterate = arr.slice(0,i+1);
            var newElement = arrayToIterate.reduce(function(acc, val) {
            return acc + val;
        },"");
        return newElement;
        });
    }
    
    var result = createArrayOfTiers(420);
    console.log(result);