【发布时间】:2019-03-25 08:04:00
【问题描述】:
我想创建一个基于两个数组的数组——全局声明的“ideaList”和“endorsements”。由于在程序的其他部分使用了ideaList 和背书,我需要它们是不可变的,我认为 .map 和 .filter 会保持这种不变性。
function prepareIdeaArray(){
var preFilteredIdeas=ideaList
.filter(hasIdeaPassedControl)
.map(obj => {obj.count = endorsements
.filter(x=>x.ideaNumber===obj.ideaNumber)
.reduce((sum, x)=>sum+x.count,0);
obj.like = endorsements
.filter(x=>x.ideaNumber===obj.ideaNumber && x.who===activeUser)
.reduce((sum, x)=>sum+x.count,0)===0?false:true
obj.position = generatePosition(obj.status)
obj.description = obj.description.replace(/\n/g, '<br>')
return obj;});
preFilteredIdeas.sort(compareOn.bind(null,'count',false)).sort(compareOn.bind(null,'position',true))
return preFilteredIdeas;
}
但是,当我在执行完这个函数后console.logideaList时,我注意到数组的对象都有“count”、“like”、“position”属性和值,这证明数组已经被突变。
我尝试仅使用 .map,但结果相同。
您知道我可以如何防止ideaList 发生变异吗?另外我想避免使用 const,因为我首先全局声明了ideaList,然后在另一个函数中为其分配了一些数据。
【问题讨论】:
-
制作副本:
let clone = [...ideaList]BTW.map()不会改变它会返回一个副本,并且原始数组不会受到影响。 -
您至少有 5 个或更多未定义的变量都是全局变量吗?
-
ideaList,背书是全局数组,activeUser是全局字符串。 hasIdeaPassedControl 和 compareOn 是函数。
标签: javascript arrays mutability