>

길이가 다른 두 객체 배열을 병합하는 작업 기능이 있습니다 (소스>세 가지 조건에서 목표 :

<올>
  • 대상 배열에서 고유 한 ID를 가진 객체 포함
  • 소스 배열에서 고유 한 ID를 가진 객체 포함
  • 소스 값에서 목표 값을 빼서 중복 된 ID를 가진 개체 포함
  • 내 질문은이 코드를 더 얇고 효율적으로 변경하려면 어떻게해야합니까? 코드를 보면 많은 계산 리소스가 필요한 것 같습니다.

    배열을 연결하고 while 루프를 통해 실행하려고했지만 어떤 객체가 어떤 배열에 속하는지 구별하는 방법을 알 수 없었습니다.

    let target = [
      { id:1, x: 50 },
      { id:2, x: 30 },
      { id:3, x: 30 }
    ];
    let source = [
      { id:1, x: 30 },
      { id:2, x: 13 },
      { id:4, x: 100 },
      { id:5, x: 5 }
    ];
    let arrayResult = [];
    function compute( target, source ) {
        for (let i = 0; i < source.length; i++ ) {
            let srcObj = source[i];
            let tarObj = target.find(d => d.id === srcObj.id)
            if (tarObj) {
                let result = {
                    id: srcObj.id,
                    x: srcObj.x - tarObj.x
                }
                arrayResult.push(result);
            } else {
                arrayResult.push(srcObj);
            }
        }
        for( let i = 0; i < target.length; i ++ ) {
            let src = target[i];
            let tar = arrayResult.find(d => d.id === src.id);
            if (!tar){
                arrayResult.push(src)
            }
        }
    }
    compute(target, source);
    console.log(arrayResult);
    
    


    • 답변 # 1

      배열 매핑을 생성하여보다 효율적으로 만들 수 있습니다 id 의 가치 source 배열의 색인에. 그런 다음 반복 할 수 있습니다 target , 각 객체가 있는지 확인 id 값은 srcids 배열, 그렇다면 해당 업데이트 source x 그렇지 않으면 객체를 source 정렬:

      let target = [
        { id:1, x: 50 },
        { id:2, x: 30 },
        { id:3, x: 30 }
      ];
      let source = [
        { id:1, x: 30 },
        { id:2, x: 13 },
        { id:4, x: 100 },
        { id:5, x: 5 }
      ];
      const srcids = source.reduce((c, o, i) => {
        c[o.id] = i;
        return c;
      }, []);
      target.forEach(o => {
        if (srcids[o.id] !== undefined) {
          source[srcids[o.id]].x -= o.x;
        } else {
          source.push(o);
        }
      });
      console.log(source);
      
      

    관련 자료

  • 이전 led - milis arduino와 함께 깜박이는 WS2812 fastLED
  • 다음 windows - bat 파일에있는 명령 - 특정 단어를 포함하는 디렉토리를 교체