Javascript 此函数仅在服务器重新启动时起作用
我有一个在运行节点服务器时运行的函数。第二次刷新页面时会抛出错误。重新启动节点服务器并第三次刷新页面时,该功能将再次工作 我有很多人Javascript 此函数仅在服务器重新启动时起作用,javascript,node.js,Javascript,Node.js,我有一个在运行节点服务器时运行的函数。第二次刷新页面时会抛出错误。重新启动节点服务器并第三次刷新页面时,该功能将再次工作 我有很多人 const members = [{ imgUrl: 'resources/members/foobar.png', name: 'Foo Bar', focus: [0, 1, 2, 4, 5] }, { imgUrl: 'resources/members/barfoo.png', name: 'Bar Foo',
const members = [{
imgUrl: 'resources/members/foobar.png',
name: 'Foo Bar',
focus: [0, 1, 2, 4, 5]
}, {
imgUrl: 'resources/members/barfoo.png',
name: 'Bar Foo',
focus: [0, 1, 2, 4, 5]
}, {
imgUrl: 'resources/members/johndoe.png',
name: 'John Doe',
focus: [1, 3, 5]
}];
我想修改这个数组
const targetMembers = members.map(member => {
member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
return member;
});
我得到的错误是
TypeError: member.focus.map is not a function
at members.map.member (C:\Users\...\...\server\routes\main.js:6:37)
at Array.map (<anonymous>)
at router.get (C:\Users\...\...\server\routes\main.js:5:35)
at Layer.handle [as handle_request] (C:\Users\...\...\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\...\...\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\...\...\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\...\...\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\...\...\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\...\...\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\...\...\node_modules\express\lib\router\index.js:275:10)
问题在于声明
member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
第一次执行-成员。焦点
是一个数组
,数组具有函数映射
,并执行。但是,在执行后,您已将member.focus更改为字符串
第二次执行-
成员。焦点
是一个字符串
,字符串没有函数映射,因此出现错误。问题在于语句
member.focus = member.focus.map(skillIndex => skills[skillIndex]).join(', ');
第一次执行-成员。焦点
是一个数组
,数组具有函数映射
,并执行。但是,在执行后,您已将member.focus更改为字符串
第二次执行-
成员。焦点
是一个字符串
,字符串没有函数映射,因此出现错误。这很可能是改变实际属性本身而不是映射到新属性的副作用。如果members
被保存在内存中,并试图以某种方式再次运行它,focus
现在是一个字符串,它不包含map
方法
映射到新对象,而不是修改现有对象:
const targetMembers = members.map(member => {
return {
...member,
focusString: member.focus.map(skillIndex => skills[skillIndex]).join(', ')
}
});
这很可能是改变实际属性本身而不是映射到新属性的副作用。如果
members
被保存在内存中,并试图以某种方式再次运行它,focus
现在是一个字符串,它不包含map
方法
映射到新对象,而不是修改现有对象:
const targetMembers = members.map(member => {
return {
...member,
focusString: member.focus.map(skillIndex => skills[skillIndex]).join(', ')
}
});
您正在将焦点从数组更改为字符串。字符串没有
map
函数,但为什么它在first try=”上一直工作?因为当您第一次运行它时,focus
仍然是一个数组。运行const targetMembers=members.map(member…
后,.join()
在执行member.focus=…
之前将数组转换为字符串,然后将其替换为.join(',')产生的字符串
。您似乎希望此操作在成员
对象的副本上运行。对象不会自动复制。您正在将焦点
从数组更改为字符串。字符串没有映射
功能,但为什么它在第一次尝试时始终有效=?因为当您第一次运行它时,焦点
是st我将创建一个数组。一旦运行const targetMembers=members.map(member…
the.join()
将数组转换为字符串,然后再执行member.focus=…
这是一个数组。之后,将其替换为.join(',')生成的字符串
。您似乎希望此操作在成员
对象的副本上进行。对象不会自动复制。如果要复制,为什么要对字符串使用不同的属性名?我想这是“从不更改数据,添加到数据”的好方法。将来可能仍然需要focus
属性。如果要复制,为什么要为字符串使用不同的属性名称?我想这是“永不更改数据,添加到数据”的好方法。将来可能仍然需要focus
属性。