복붙노트

[JQUERY] 자바 스크립트 : 객체에 대한 필터 ()

JQUERY

자바 스크립트 : 객체에 대한 필터 ()

해결법


  1. 1.결코 이제까지 Object.prototype에 확장하지 않습니다.

    결코 이제까지 Object.prototype에 확장하지 않습니다.

    끔찍한 일들이 코드에 발생합니다. 상황이 중단됩니다. 당신은 객체 리터럴을 포함한 모든 객체 유형을 확장하고 있습니다.

    여기에 당신이 시도 할 수있는 간단한 예입니다 :

        // Extend Object.prototype
    Object.prototype.extended = "I'm everywhere!";
    
        // See the result
    alert( {}.extended );          // "I'm everywhere!"
    alert( [].extended );          // "I'm everywhere!"
    alert( new Date().extended );  // "I'm everywhere!"
    alert( 3..extended );          // "I'm everywhere!"
    alert( true.extended );        // "I'm everywhere!"
    alert( "here?".extended );     // "I'm everywhere!"
    

    대신 당신이 개체를 전달하는 기능을 만들 수 있습니다.

    Object.filter = function( obj, predicate) {
        let result = {}, key;
    
        for (key in obj) {
            if (obj.hasOwnProperty(key) && !predicate(obj[key])) {
                result[key] = obj[key];
            }
        }
    
        return result;
    };
    

  2. 2.우선, 그것은 Object.prototype에 연장 나쁜 연습 간주됩니다. 대신, 이미 등 Object.keys, Object.assign, Object.is, ... 거기처럼 객체에 대한 효용 함수로 기능을 제공합니다.

    우선, 그것은 Object.prototype에 연장 나쁜 연습 간주됩니다. 대신, 이미 등 Object.keys, Object.assign, Object.is, ... 거기처럼 객체에 대한 효용 함수로 기능을 제공합니다.

    여기 몇 가지 솔루션을 제공합니다 :

    줄이고 Object.keys으로하면 원하는 필터 (ES6 구문을 이용하여 화살표)를 구현한다 :

    Object.filter = (OBJ, 술어) => Object.keys (OBJ) .filter (키 => 술어 (OBJ [키])) .reduce ((입술, 키) => (입술 [키 = OBJ [키, 해상도), {}); // 사용 예 : VAR 점수 = { 존 : 2, 사라 : 3, 자넷 : 1 }; VAR 여과 = Object.filter (득점, 점수 => 점수> 1); (필터링) CONSOLE.LOG;

    위의 코드 술어에이 Array.prototype.filter 작동하는 방법과 일치한다 그래서, (배제 조건에 사용되는 영업 이익에 반하는)를 포함 상태 여야합니다.

    상기 용액에 콤마 연산자 돌연변이 입술 객체를 반환 감소 부분에서 사용된다. 이것은 물론 대신 한 표현의 두 문장으로 기록 될 수 있지만, 후자는보다 간결하다. 쉼표 연산자없이 작업을 수행하려면, 당신은 돌연변이 개체를 반환 않는 대신 Object.assign을 사용할 수 있습니다 :

    Object.filter = (OBJ, 술어) => Object.keys (OBJ) .filter (키 => 술어 (OBJ [키])) .reduce ((입술, 키) => Object.assign (입술, {[키] OBJ [키]}) {}); // 사용 예 : VAR 점수 = { 존 : 2, 사라 : 3, 자넷 : 1 }; VAR 여과 = Object.filter (득점, 점수 => 점수> 1); (필터링) CONSOLE.LOG;

    여기서 우리는 한번만 이루어 지도록 루프 밖으로 Object.assign 호를 이동하고 그것을 (확산 구문을 이용하여) 개별 인자로 각각의 키를 건네

    Object.filter = (OBJ, 술어) => Object.assign (... Object.keys (OBJ) .filter (키 => 술어 (OBJ [키])) .MAP (키 => ({[키] OBJ [키]}))); // 사용 예 : VAR 점수 = { 존 : 2, 사라 : 3, 자넷 : 1 }; VAR 여과 = Object.filter (득점, 점수 => 점수> 1); (필터링) CONSOLE.LOG;

    용액은 중간 어레이 객체를 변환 한 후, 일반 오브젝트에 그 위로 변환으로서, 즉 키 / 값 쌍의 어레이로부터 객체를 생성 (Object.entries (ES2017)를 사용하고 대향 있도록 유용 할 ) Object.fromEntries (ES2019)와.

    그것은 개체에 대한 "한 줄"방법에 이르게 :

    Object.filter = (OBJ, 술어) => Object.fromEntries (Object.entries (OBJ) .filter (술어)); // 사용 예 : VAR 점수 = { 존 : 2, 사라 : 3, 자넷 : 1 }; VAR 여과 = Object.filter (스코어 ([이름, 점수) => 점수> 1); (필터링) CONSOLE.LOG;

    술어 함수는 비트 다른 여기에 인자로 키 / 값 쌍을 얻을 수 있지만, 조건 자 함수의 논리에 더 많은 가능성을 허용합니다.


  3. 3.사용 밑줄 또는 lodash 수있는 좋은 방법입니다 기꺼이 당신이 경우에, 당신은 선택할 수 있습니다 (또는 그 반대 생략).

    사용 밑줄 또는 lodash 수있는 좋은 방법입니다 기꺼이 당신이 경우에, 당신은 선택할 수 있습니다 (또는 그 반대 생략).

    밑줄의 문서에서 예제 :

    _.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
    // {name: 'moe', age: 50}
    

    아니면 콜백 (lodash를 들어, pickBy 사용) :

    _.pick({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object) {
      return _.isNumber(value);
    });
    // {age: 50}
    

  4. 4.

    let romNumbers={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    

    당신은 romNumbers 키에 의해 개체를 필터링 할 수 있습니다 :

    const filteredByKey = Object.fromEntries(Object.entries(romNumbers).filter(([key, value]) => key === 'I'))
    // filteredByKey = {I: 1} 
    

    또는 필터 romNumbers는 값으로 객체 :

     const filteredByValue = Object.fromEntries(Object.entries(romNumbers).filter(([key, value]) => value === 5))
     // filteredByValue = {V: 5} 
    

  5. 5.ES6 접근 ...

    ES6 접근 ...

    아래이 객체가 상상 :

    const developers = {
      1: {
       id: 1,
       name: "Brendan", 
       family: "Eich"
      },
      2: {
       id: 2,
       name: "John", 
       family: "Resig"
      },  
      3: {
       id: 3,
       name: "Alireza", 
       family: "Dezfoolian"
     }
    };
    

    함수를 만듭니다

    const filterObject = (obj, filter, filterValue) => 
       Object.keys(obj).reduce((acc, val) => 
       (obj[val][filter] === filterValue ? acc : {
           ...acc,
           [val]: obj[val]
       }                                        
    ), {});
    

    그리고 전화 :

    filterObject(developers, "name", "Alireza");
    

    반환합니다 :

    {
      1: {
      id: 1,
      name: "Brendan", 
      family: "Eich"
      },
      2: {
       id: 2,
       name: "John", 
       family: "Resig"
      }
    }
    

  6. 6.패트릭은 이미 언급 한 바와 같이이 거의 확실 혹시 사용 할 수있는 제 3 자 코드를 깰 것 같은이, 나쁜 생각이다.

    패트릭은 이미 언급 한 바와 같이이 거의 확실 혹시 사용 할 수있는 제 3 자 코드를 깰 것 같은이, 나쁜 생각이다.

    당신은 Object.prototype에, (hasOwnProperty 검사없이) 객체를 통해 그 게으른 반복되는 이유를 확장 할 경우 추가 기능은 반복의 일부가 될 것입니다 때문에 JQuery와 또는 프로토 타입과 같은 모든 라이브러리는 중단됩니다 중단됩니다.


  7. 7.방법에 대해 :

    방법에 대해 :

    function filterObj(keys, obj) {
      const newObj = {};
      for (let key in obj) {
        if (keys.includes(key)) {
          newObj[key] = obj[key];
        }
      }
      return newObj;
    }
    

    또는...

    function filterObj(keys, obj) {
      const newObj = {};
      Object.keys(obj).forEach(key => {
        if (keys.includes(key)) {
          newObj[key] = obj[key];
        }
      });
      return newObj;
    }
    

  8. 8.주어진

    주어진

    object = {firstname: 'abd', lastname:'tm', age:16, school:'insat'};
    
    keys = ['firstname', 'age'];
    

    다음 :

    keys.reduce((result, key) => ({ ...result, [key]: object[key] }), {});
    // {firstname:'abd', age: 16}
    

    // 도우미 함수 필터 (객체 키 ...) { 리턴 keys.reduce ((결과, 키) => ({... 결과 [키] 오브젝트 [키]}) {}); }; //예 CONST 사람 = {FIRSTNAME 'ABD', LASTNAME 'TM', 나이 : 16 학교 : 'INSAT'}; 단지 firstName과 나이 키를 선택하는 예상 // CONSOLE.LOG ( 필터 (사람, 'FIRSTNAME', '연령') )


  9. 9.I 함수가 아니라 필터 않는 Object.filter ()를 생성했지만, 또한 포함하는 키 배열 수용한다. 선택 사양 인 세 번째 매개 변수는 필터를 반전 할 수 있습니다.

    I 함수가 아니라 필터 않는 Object.filter ()를 생성했지만, 또한 포함하는 키 배열 수용한다. 선택 사양 인 세 번째 매개 변수는 필터를 반전 할 수 있습니다.

    var foo = {
        x: 1,
        y: 0,
        z: -1,
        a: 'Hello',
        b: 'World'
    }
    
    Object.filter(foo, ['z', 'a', 'b'], true);
    
    Object.filter(foo, function (key, value) {
        return Ext.isString(value);
    });
    

    면책 조항 : 나는 간결 내선 JS 코어를 사용하기로 결정했습니다. 문제의 일부가 아니었다으로 개체 유형에 대한 유형 검사 프로그램을 작성할 필요하다고 생각하지 않았다.


  10. 10.내 의견을 고집 솔루션 :

    내 의견을 고집 솔루션 :

    function objFilter(obj, filter, nonstrict){
      r = {}
      if (!filter) return {}
      if (typeof filter == 'string') return {[filter]: obj[filter]}
      for (p in obj) {
        if (typeof filter == 'object' &&  nonstrict && obj[p] ==  filter[p]) r[p] = obj[p]
        else if (typeof filter == 'object' && !nonstrict && obj[p] === filter[p]) r[p] = obj[p]
        else if (typeof filter == 'function'){ if (filter(obj[p],p,obj)) r[p] = obj[p]}
        else if (filter.length && filter.includes(p)) r[p] = obj[p]
      }
      return r
    }
    

    테스트 케이스 :

    obj = {a:1, b:2, c:3}
    
    objFilter(obj, 'a') // returns: {a: 1}
    objFilter(obj, ['a','b']) // returns: {a: 1, b: 2}
    objFilter(obj, {a:1}) // returns: {a: 1}
    objFilter(obj, {'a':'1'}, true) // returns: {a: 1}
    objFilter(obj, (v,k,o) => v%2===1) // returns: {a: 1, c: 3}
    

    https://gist.github.com/bernardoadc/872d5a174108823159d845cc5baba337


  11. 11.당신은 동일한 개체를 변이보다는 새로 작성하고자하는 경우.

    당신은 동일한 개체를 변이보다는 새로 작성하고자하는 경우.

    다음의 예는 모두 0 또는 빈 값을 삭제합니다 :

    const sev = { a: 1, b: 0, c: 3 };
    const deleteKeysBy = (obj, predicate) =>
      Object.keys(obj)
        .forEach( (key) => {
          if (predicate(obj[key])) {
            delete(obj[key]);
          }
        });
    
    deleteKeysBy(sev, val => !val);
    

  12. 12.모두가 말했듯이, 프로토 타입의 주위에 나사를하지 않습니다. 대신, 단순히 그렇게 할 함수를 작성. 여기 lodash 내 버전입니다 :

    모두가 말했듯이, 프로토 타입의 주위에 나사를하지 않습니다. 대신, 단순히 그렇게 할 함수를 작성. 여기 lodash 내 버전입니다 :

    import each from 'lodash/each';
    import get from 'lodash/get';
    
    const myFilteredResults = results => {
      const filteredResults = [];
    
      each(results, obj => {
        // filter by whatever logic you want.
    
        // sample example
        const someBoolean = get(obj, 'some_boolean', '');
    
        if (someBoolean) {
          filteredResults.push(obj);
        }
      });
    
      return filteredResults;
    };
    

  13. 13.내가 필요로 할 때 나는 이것을 사용

    내가 필요로 할 때 나는 이것을 사용

    const filterObject = (obj, condition) => {
        const filteredObj = {};
        Object.keys(obj).map(key => {
          if (condition(key)) {
            dataFiltered[key] = obj[key];
          }
        });
      return filteredObj;
    }
    

  14. 14.자바 스크립트를 사용하여 개체의 배열을 검색하는 방법 : 객체에 대한 필터를 ()

    자바 스크립트를 사용하여 개체의 배열을 검색하는 방법 : 객체에 대한 필터를 ()

    {[= 항목을 보자 ID : 1, 이 isActive : 사실, 나이 : 40, FIRST_NAME '디커 슨' LAST_NAME '맥도날드' }, { ID : 2, 이 isActive : 거짓, 나이 : 21 FIRST_NAME '라센', LAST_NAME : '쇼' }, { ID : 3, 이 isActive : 거짓, 나이 : 89, FIRST_NAME : '제네바' LAST_NAME '윌슨' }, { ID : 4, 이 isActive : 사실, 나이 : 38, FIRST_NAME : '맥', LAST_NAME : '헨리' } ]; 검색 기능 (발) { {searchedItems = items.filter ((항목) =>를 보자 반환 Object.keys (항목) K2661에 ((키) => { 리턴 스트링 (항목 [키])와 toLowerCase () 같이 IndexOf (val.toLowerCase ())> -1..; }) }); 반환 searchedItems; } CONSOLE.LOG (검색 ( "맥"))


  15. 15.이러한 경우에 나는 개체를 처리 할 수있는 JQuery와 $의 .MAP을 사용합니다. 다른 답변에서 언급 한 바와 같이, 그것은 기본 프로토 타입을 변경하는 것이 관행이 아니다 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#Bad_practice_Extension_of_native_prototypes)

    이러한 경우에 나는 개체를 처리 할 수있는 JQuery와 $의 .MAP을 사용합니다. 다른 답변에서 언급 한 바와 같이, 그것은 기본 프로토 타입을 변경하는 것이 관행이 아니다 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#Bad_practice_Extension_of_native_prototypes)

    다음은 필터링 불과하여 개체의 일부 속성을 확인하는 예입니다. 당신의 상태가 사실인지 아닌지 undefined를 반환하는 경우 그것은 자신의 개체를 반환합니다. 정의되지 않은 속성은 그 기록이 개체 목록에서 사라지게됩니다;

    $.map(yourObject, (el, index)=>{
        return el.yourProperty ? el : undefined;
    });
    
  16. from https://stackoverflow.com/questions/5072136/javascript-filter-for-objects by cc-by-sa and MIT license