使用函数式编程将单词大写 - 多维数组

时间:2017-04-25 20:42:46

标签: javascript arrays multidimensional-array

使用.forEach(),。map(),. redce(),. filter()进行函数式编程

var arr = [
   {name: 'John', cars: '2', railcard: 'yes', preferences: ['taxi', 'tram', 'walking']},
   {name: 'Mary', cars: '0', railcard: 'no', preferences: ['cyling', 'walking', 'taxi']},
   {name: 'Elon', cars: '100000', railcard: 'no', preferences: ['Falcon 9', 'self-driving', 'Hyper-loop']}
]; 

我正在尝试使用.forEach()来大写名称,但是我很难将任何方法应用于结果。

var capitaliseName = function (x) {
  return x.toUpperCase();
};

var arrCapitals = arr.forEach(function(name) {
  return capitaliseName( arr.name );
});

以上结果为空。我真的可以用一些解释。

我期待的输出是:

var arr = [
   {name: 'JOHN', cars: '2', railcard: 'yes', preferences: ['taxi', 'tram', 'walking']},
   {name: 'MARY', cars: '0', railcard: 'no', preferences: ['cyling', 'walking', 'taxi']},
   {name: 'ELON', cars: '100000', railcard: 'no', preferences: ['Falcon 9', 'self-driving', 'Hyper-loop']}
]; 

我之前问过这个问题How do I replace a string with integers in a multi-dimensional array

3 个答案:

答案 0 :(得分:0)

forEach()不会返回任何内容。它循环遍历每个值,但不会返回。此外,在forEach()内,您所谓的name实际上就是整个对象。而不是arr.name,请使用name.name(更好的是,将参数重命名为nameobj并执行obj.name)。

你有几个选择。最简单的是您的arr已经拥有大写名称。

arr.forEach(function(obj) {
  obj.name = capitaliseName( obj.name );
});

console.log(arr); // has capitalized names

如果要创建新数组而不更改上一个数组,请使用map()而不是forEach(),并在每个循环中返回整个对象。

const arrCapitalized = arr.map(obj => Object.assign(obj, { name: capitalizeName(obj.name));

答案 1 :(得分:0)

你应该切换到map函数,因为map return array和forEach not,并且每次迭代都有另一个问题,你有整个对象,你应该使用Object.assign创建另一个大写名称的对象



var arrCapitals = arr.map(function(obj) {
  return Object.assign({},obj, {
    name: obj.name.toUpperCase()
  })
});




答案 2 :(得分:0)

你的代码似乎没问题,除了两种情况:

  • Array#forEach没有返回任何内容,在您的特定情况下,我建议您改用Array#map。如果只想修改原始对象数组,Hovewer Array#forEach会很有用。
  • arrCapitals函数中,回调函数内传递的name参数代表name变量中的每个arr属性。这就是为什么当你使用name.name引用整个数组时,arr.name必须引用它的原因。



var arr = [
   {name: 'John', cars: '2', railcard: 'yes', preferences: ['taxi', 'tram', 'walking']},
   {name: 'Mary', cars: '0', railcard: 'no', preferences: ['cyling', 'walking', 'taxi']},
   {name: 'Elon', cars: '100000', railcard: 'no', preferences: ['Falcon 9', 'self-driving', 'Hyper-loop']}
]; 

var capitaliseName = function (x) {
  return x.toUpperCase();
};

var arrCapitals = arr.map(function(name) {
  return capitaliseName( name.name );
});                //    ^^^ each single name element from each object inside arr array

console.log(arrCapitals);