使用.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
答案 0 :(得分:0)
forEach()
不会返回任何内容。它循环遍历每个值,但不会返回。此外,在forEach()
内,您所谓的name
实际上就是整个对象。而不是arr.name
,请使用name.name
(更好的是,将参数重命名为name
至obj
并执行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);