Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript—改进动态对象的构造_Javascript_Arrays_Loops_Object_If Statement - Fatal编程技术网

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
}