Javascript .map()函数更新上一个变量
我想用checked:true作为逗号分隔的字符串来获取对象的值Javascript .map()函数更新上一个变量,javascript,angular,loops,Javascript,Angular,Loops,我想用checked:true作为逗号分隔的字符串来获取对象的值 var arr = [{ week_days: [ {name: 'Mo', value: 'Monday', checked: true}, {name: 'Tu', value: 'Tuesday', checked: true}, {name: 'We', value: 'Wednesday', checked: true}, {name: 'Th'
var arr = [{
week_days: [
{name: 'Mo', value: 'Monday', checked: true},
{name: 'Tu', value: 'Tuesday', checked: true},
{name: 'We', value: 'Wednesday', checked: true},
{name: 'Th', value: 'Thursday', checked: true},
{name: 'Fr', value: 'Friday', checked: true},
{name: 'Sa', value: 'Saturday', checked: false},
{name: 'Su', value: 'Sunday', checked: false}
],
weekend_days: [
{name: 'Mo', value: 'Monday', checked: false},
{name: 'Tu', value: 'Tuesday', checked: false},
{name: 'We', value: 'Wednesday', checked: false},
{name: 'Th', value: 'Thursday', checked: false},
{name: 'Fr', value: 'Friday', checked: false},
{name: 'Sa', value: 'Saturday', checked: true},
{name: 'Su', value: 'Sunday', checked: true}
]
}];
const newArr = arr;
newArr.map((val)=>{
let w = [];
let we = [];
val.week_days.map((val2)=>{
if(val2.checked == true){
w.push(val2.value);
}
})
val.weekend_days.map((val3)=>{
if(val3.checked == true){
we.push(val3.value);
}
})
val.week_days = w.join();
val.weekend_days = we.join();
})
console.log(arr, newArr);
预期产量:/工作良好
newArr = [
{
week_days: "Monday,Tuesday,Wednesday,Thursday,Friday",
weekend_days: "Saturday,Sunday"
}
]
但问题是map也更新了arr
arr应与之前相同
意外输出:
arr = [
{
week_days: "Monday,Tuesday,Wednesday,Thursday,Friday",
weekend_days: "Saturday,Sunday"
}
]
@Jornsharpe已经告诉你了它不起作用的原因。尽管如此,我还是想建议一个没有副作用的更具可读性的解决方案 常数arr=[{ 星期日:[ {name:'Mo',value:'Monday',checked:true}, {name:'Tu',value:'sunday',checked:true}, {name:'We',value:'星期三',checked:true}, {name:'Th',value:'striday',checked:true}, {name:'Fr',value:'Friday',checked:true}, {name:'Sa',value:'Saturday',checked:false}, {名称:'Su',值:'Sunday',选中:false} ], 周末(星期日)[ {name:'Mo',value:'Monday',checked:false}, {name:'Tu',value:'sunday',checked:false}, {name:'We',value:'星期三',checked:false}, {name:'Th',value:'striday',checked:false}, {name:'Fr',value:'Friday',checked:false}, {name:'Sa',value:'Saturday',选中:true}, {名称:'Su',值:'Sunday',选中:true} ] }]; const result=arr.mapval=>{ 返回{ 星期天:val.week\u days.filterx=>x.checked.mapx=>x.value.join,, 周末:val.weekend\u days.filterx=>x.checked.mapx=>x.value.join, } };
console.logresult;newArr=arr不创建副本。此外,如果您要忽略它创建的新数组,并且仅将其用于副作用,则不应使用map;使用forEach。很抱歉问一下,为什么newArr=arr不创建一个副本呢?是的,请注意,我也说过-从map切换到forEach不会改变arr和newArr是同一个对象的单独事实。提取模型不是很理想。这可以通过其他方式实现。也就是说,请查看以了解为什么原始阵列也会被修改。创建深度副本的一种快速方法是newArr=JSON.parseJSON.stringifyarr@najamusaqib:我不确定您是否是一般编程新手。如果你不清楚通过值传递还是通过引用传递,那么很多好的文章只需要谷歌搜索就可以了。搜索“按值传递”与“按引用传递”。