JavaScript—改进动态对象的构造
我有一个构建对象的脚本:JavaScript—改进动态对象的构造,javascript,arrays,loops,object,if-statement,Javascript,Arrays,Loops,Object,If Statement,我有一个构建对象的脚本: console.log(solution([2, 1, 3, 5, 3, 2])) function solution(inputArray) { let arrMap = [] for (let i = 0; i < inputArray.length; i++) { var repeated = false; var e = arrMap.find(s => s.element == inputArray[i])
console.log(solution([2, 1, 3, 5, 3, 2]))
function solution(inputArray) {
let arrMap = []
for (let i = 0; i < inputArray.length; i++) {
var repeated = false;
var e = arrMap.find(s => s.element == inputArray[i])
if(e){
repeated = true;
e.repeated = true;
e.firstPosition = e.position
e.lastPosition = i
delete e['position'];
}
arrMap.push({
element : inputArray[i],
position: i,
repeated: repeated
})
}
return arrMap
}
我只是想通过删除重复的项目的剩余行(在本例中为项目2和3)来更改报税表。如下图所示:
[
{ element: 2, repeated: true, firstPosition: 0, lastPosition: 5 },
{ element: 1, position: 1, repeated: false },
{ element: 3, repeated: true, firstPosition: 2, lastPosition: 4 },
{ element: 5, position: 3, repeated: false },
{ element: 3, position: 4, repeated: true }, //<---- DUPLICATED! DELETE THIS LINE
{ element: 2, position: 5, repeated: true } //<---- DUPLICATED! DELETE THIS LINE
]
[
{ element: 2, repeated: true, firstPosition: 0, lastPosition: 5 },
{ element: 1, position: 1, repeated: false },
{ element: 3, repeated: true, firstPosition: 2, lastPosition: 4 },
{ element: 5, position: 3, repeated: false },
]
减少到中间对象使检查元素是否已添加到结果中变得更容易(而且更便宜,性能更高):
const solution=(a)=>Object.values(a.reduce((a,v,i)=>{
if(a[v]){
a[v]。重复=真;
a[v].firstPosition=a[v].firstPosition | | a[v].位置;
a[v].lastPosition=i;
删除[v]位置;
}否则{
a[v]={
要素:v,
重复:错,
职位:i
};
}
返回a;
}, {}));
log(解决方案([2,1,3,5,3,2])代码>我根据用户120242的想法改进了代码,现在它运行良好,达到了预期的效果
function solution(inputArray) {
let arrMap = []
for (let i = 0; i < inputArray.length; i++) {
var e = arrMap.find(s => s.element == inputArray[i])
if (e) {
e.repeated = true;
e.firstPosition = e.position
e.lastPosition = i
delete e['position'];
} else {
arrMap.push({
repeated: false,
element: inputArray[i],
position: i,
repeated: repeated
})
}
}
return arrMap
}
函数解决方案(输入阵列){
让arrMap=[]
对于(设i=0;is.element==inputArray[i])
如果(e){
e、 重复=正确;
e、 firstPosition=e.position
e、 lastPosition=i
删除e[‘位置’];
}否则{
arrMap.push({
重复:错,
元素:输入阵列[i],
职位:我,
重复:重复
})
}
}
返回arrMap
}
只需在arrMap.push之前添加一个else
,这样只有在没有找到重复项时才会进行推送。您的代码当前总是尝试添加新元素。
function solution(inputArray) {
let arrMap = []
for (let i = 0; i < inputArray.length; i++) {
var e = arrMap.find(s => s.element == inputArray[i])
if (e) {
e.repeated = true;
e.firstPosition = e.position
e.lastPosition = i
delete e['position'];
} else {
arrMap.push({
repeated: false,
element: inputArray[i],
position: i,
repeated: repeated
})
}
}
return arrMap
}