在 javascript 中使用 reduce 方法从数组中删除冗余方向
Remove redundant directions from array using reduce method in javascript
我有一个问题,我应该从数组中删除多余的方向。例如,如果我有 ["N"、"S"、"E"、"W"、"E"],我会 return ["E"] 因为南北抵消,东西抵消取消离开东边。如果它们相邻,则它们相互抵消。如果我有 ['W'、'N'、'S'、'E'、'N'],它 returns ["N"] 因为 N, S取消,留下W,E也取消。我创建了一个有效的函数:
function mapQuest(arr) {
const directions = { N: 2, S: -2, W: 1, E: -1 };
for (let i = 0; i < arr.length; i++) {
while (directions[arr[i]] + directions[arr[i + 1]] == 0) {
arr.splice(i, 2);
i = 0;
}
}
return arr;
}
但是问题是要求在javascript中使用reduce方法解决问题。我开始写一个:
function mapQuest(arr) {
let result = arr.reduce((acc, dir) => acc[dir]++, { N: 0, S: 0, W: 0, E: 0 });
}
但我不知道从这里到哪里去,也不知道如何在没有 for 循环遍历 i 的情况下仅取消相邻方向。如果有人可以帮忙,那就太好了。谢谢!
你可以检查数组中是否还有相反数。如果有,只需 splice
即可。如果不是,则将当前方向推入数组:
function mapQuest(arr) {
const opposites = { N: 'S', S: 'N', W: 'E', E: 'W' };
return arr.reduce((acc, dir) => {
const oppositeIndex = acc.indexOf(opposites[dir]);
if (oppositeIndex > -1) {
acc.splice(oppositeIndex, 1);
} else {
acc.push(dir);
}
return acc;
}, []);
}
console.log(mapQuest(["N", "S", "E", "W", "E"])); // ["E"]
console.log(mapQuest(['W', 'N', 'S', 'E', 'N'])); // ["N"]
试试这个:
let arr = ['W', 'N', 'S', 'E', 'N'];
let result = arr.reduce((acc, cur) => {
if(acc.toCancel.length === 0){
acc.toCancel.push(cur);
acc.result = cur;
return acc;
}else{
let pair = `${acc.toCancel[0]}${cur}`;
if(acc.pairs.includes(pair)){
acc.toCancel = [];
acc.result = cur === acc.result? "":acc.result;
}
return acc;
}
},{toCancel:[], result:"", pairs:["EW", "NS", "WE", "SN"]});
console.log(result);
我有一个问题,我应该从数组中删除多余的方向。例如,如果我有 ["N"、"S"、"E"、"W"、"E"],我会 return ["E"] 因为南北抵消,东西抵消取消离开东边。如果它们相邻,则它们相互抵消。如果我有 ['W'、'N'、'S'、'E'、'N'],它 returns ["N"] 因为 N, S取消,留下W,E也取消。我创建了一个有效的函数:
function mapQuest(arr) {
const directions = { N: 2, S: -2, W: 1, E: -1 };
for (let i = 0; i < arr.length; i++) {
while (directions[arr[i]] + directions[arr[i + 1]] == 0) {
arr.splice(i, 2);
i = 0;
}
}
return arr;
}
但是问题是要求在javascript中使用reduce方法解决问题。我开始写一个:
function mapQuest(arr) {
let result = arr.reduce((acc, dir) => acc[dir]++, { N: 0, S: 0, W: 0, E: 0 });
}
但我不知道从这里到哪里去,也不知道如何在没有 for 循环遍历 i 的情况下仅取消相邻方向。如果有人可以帮忙,那就太好了。谢谢!
你可以检查数组中是否还有相反数。如果有,只需 splice
即可。如果不是,则将当前方向推入数组:
function mapQuest(arr) {
const opposites = { N: 'S', S: 'N', W: 'E', E: 'W' };
return arr.reduce((acc, dir) => {
const oppositeIndex = acc.indexOf(opposites[dir]);
if (oppositeIndex > -1) {
acc.splice(oppositeIndex, 1);
} else {
acc.push(dir);
}
return acc;
}, []);
}
console.log(mapQuest(["N", "S", "E", "W", "E"])); // ["E"]
console.log(mapQuest(['W', 'N', 'S', 'E', 'N'])); // ["N"]
试试这个:
let arr = ['W', 'N', 'S', 'E', 'N'];
let result = arr.reduce((acc, cur) => {
if(acc.toCancel.length === 0){
acc.toCancel.push(cur);
acc.result = cur;
return acc;
}else{
let pair = `${acc.toCancel[0]}${cur}`;
if(acc.pairs.includes(pair)){
acc.toCancel = [];
acc.result = cur === acc.result? "":acc.result;
}
return acc;
}
},{toCancel:[], result:"", pairs:["EW", "NS", "WE", "SN"]});
console.log(result);