[JQUERY] 자바 스크립트 : 객체에 대한 필터 ()
JQUERY자바 스크립트 : 객체에 대한 필터 ()
해결법
-
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.우선, 그것은 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.사용 밑줄 또는 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.
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.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.패트릭은 이미 언급 한 바와 같이이 거의 확실 혹시 사용 할 수있는 제 3 자 코드를 깰 것 같은이, 나쁜 생각이다.
패트릭은 이미 언급 한 바와 같이이 거의 확실 혹시 사용 할 수있는 제 3 자 코드를 깰 것 같은이, 나쁜 생각이다.
당신은 Object.prototype에, (hasOwnProperty 검사없이) 객체를 통해 그 게으른 반복되는 이유를 확장 할 경우 추가 기능은 반복의 일부가 될 것입니다 때문에 JQuery와 또는 프로토 타입과 같은 모든 라이브러리는 중단됩니다 중단됩니다.
-
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.주어진
주어진
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.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.내 의견을 고집 솔루션 :
내 의견을 고집 솔루션 :
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.당신은 동일한 개체를 변이보다는 새로 작성하고자하는 경우.
당신은 동일한 개체를 변이보다는 새로 작성하고자하는 경우.
다음의 예는 모두 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.모두가 말했듯이, 프로토 타입의 주위에 나사를하지 않습니다. 대신, 단순히 그렇게 할 함수를 작성. 여기 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.내가 필요로 할 때 나는 이것을 사용
내가 필요로 할 때 나는 이것을 사용
const filterObject = (obj, condition) => { const filteredObj = {}; Object.keys(obj).map(key => { if (condition(key)) { dataFiltered[key] = obj[key]; } }); return filteredObj; }
-
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.이러한 경우에 나는 개체를 처리 할 수있는 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; });
from https://stackoverflow.com/questions/5072136/javascript-filter-for-objects by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 플러그인 jQuery를 확인 : 지정을 위해 사용하지 않도록 검증 버튼을 제출 (0) | 2020.10.06 |
---|---|
[JQUERY] 어떻게 자바 스크립트에서 X, Y 좌표를 사용하여 클릭을 시뮬레이션? (0) | 2020.10.06 |
[JQUERY] 수평 상단에 스크롤 및 테이블의 맨 아래 (0) | 2020.10.06 |
[JQUERY] 어떻게 JQuery와 또는 자바 스크립트와 객체의 배열을 정렬하려면 [중복] (0) | 2020.10.06 |
[JQUERY] `on`와`live` 또는`bind`의 차이점은 무엇입니까? (0) | 2020.10.06 |