programing

어레이 맵을 사용하여 조건부로 결과 필터링

abcjava 2023. 3. 22. 20:34
반응형

어레이 맵을 사용하여 조건부로 결과 필터링

어레이 맵을 사용하여 오브젝트를 조금 더 필터링하여 서버로 보낼 준비를 하려고 합니다.1개의 키 값으로 필터링 할 수 있기 때문에 매우 좋지만, 한 걸음 더 나아가 부울값과 대조해 보고 싶습니다.

그래서 지금 내가 가진 건 이거야

$scope.appIds = $scope.applicationsHere.map( function(obj){
        if(obj.selected == true){
            return obj.id;
        }
    });

이 방법은 ID를 추출하는 데 매우 효과적이지만 선택한 값이 == false일 경우 이 새 배열에 푸시하고 싶지 않으므로 추가 필터링 조건을 붙였습니다.이렇게 하면 ID 배열을 얻을 수 있지만 .select == false를 선택한 ID는 null 값만으로 배열에 남아 있습니다.오브젝트에 4개의 아이템이 있고 그 중 2개가 false일 경우 다음과 같습니다.

 appIds = {id1, id2, null, null};

내 질문은 - 거기에 null을 넣지 않고 이것을 할 수 있는 방법이 있느냐는 것이다.읽어주셔서 감사합니다!

고객님이 찾고 있는 것은.filter()기능:

  $scope.appIds = $scope.applicationsHere.filter(function(obj) {
    return obj.selected;
  });

그러면 "선택된" 속성이 다음과 같은 개체만 포함하는 배열이 생성됩니다.true(또는 truthy).

커피를 마시고 있었는데 댓글을 놓쳐서 죄송합니다.- 네, jandy가 댓글에서 언급했듯이 "id" 값만 필터링하고 추출하면 다음과 같습니다.

  $scope.appIds = $scope.applicationsHere.filter(function(obj) {
    return obj.selected;
  }).map(function(obj) { return obj.id; });

일부 기능 라이브러리( 생각에 충분한 사랑을 받지 못하는 기능)는.pluck()오브젝트 리스트에서 속성값을 추출하는 함수입니다만, 네이티브 자바스크립트에는 이러한 툴이 매우 희박합니다.

이를 수행하려면 Array.protype.reduce를 사용해야 합니다.JS 퍼포먼스 테스트를 조금 실시해, 이 테스트의 퍼포먼스를 검증했습니다..filter+.map.

$scope.appIds = $scope.applicationsHere.reduce(function(ids, obj){
    if(obj.selected === true){
        ids.push(obj.id);
    }
    return ids;
}, []);

알기 쉽게 하기 위해 여기 샘플이 있습니다..reduceJSPerf 테스트에서 사용:

  var things = [
    {id: 1, selected: true},
    {id: 2, selected: true},
    {id: 3, selected: true},
    {id: 4, selected: true},
    {id: 5, selected: false},
    {id: 6, selected: true},
    {id: 7, selected: false},
    {id: 8, selected: true},
    {id: 9, selected: false},
    {id: 10, selected: true},
  ];
  
  	
var ids = things.reduce((ids, thing) => {
  if (thing.selected) {
    ids.push(thing.id);
  }
  return ids;
}, []);

console.log(ids)


편집 1

참고: 2018년 2월 기준으로 축소 + 푸시 속도는 Chrome Edge에서 가장 빠르지만 Firefox의 Filter + Map보다 느립니다.

platMap을 사용할 수 있습니다.필터링과 매핑을 하나로 할 수 있습니다.

$scope.appIds = $scope.applicationsHere.flatMap(obj => obj.selected ? obj.id : [])

2019년에 누가 이걸 보게 되면 알려드릴게요.

reduce vs map + filter는 루프에 필요한 항목에 따라 다를 수 있습니다.확실하진 않지만 줄이는 게 더 느린 것 같아요.

한 가지 확실한 것은 성능 향상을 원하신다면 코드 작성 방법이 매우 중요하다는 것입니다.

여기에서는 "잘못된" 값을 확인하는 대신 코드를 완전히 입력했을 때 크게 개선되었음을 보여주는 JS 성능 테스트(예:if (string) {...}거짓

이게 도움이 됐으면 좋겠는데

심플한 솔루션

SomeArrayValues.filter(x=> x.id !== idNameDetailsColorDto.id).map(ids => (ids.id))

언급URL : https://stackoverflow.com/questions/26716818/using-array-map-to-filter-results-with-if-conditional

반응형