JS 는 간단 한 것 부터 다 중 조건 까지 그룹 필터 링 을 실현 합 니 다.
일반적인 상황 에서 단일 조건 으로 선별 하면 배열 의 filter 방법 은 수 요 를 만족 시 킬 수 있 습 니 다.본 고 는 여러 조건 에서 의 복합 선별 에 중심 을 두 고 관련 지식 을 제시 하 는 데 중심 을 두 었 습 니 다.
다음은 여러 개.🌰🌰🌰🌰
//
var aim = [
{name:'Anne', age: 23, gender:'female'},
{name:'Leila', age: 16, gender:'female'},
{name:'Jay', age: 19, gender:'male'},
{name:'Mark', age: 40, gender:'male'}
]
단일 조건 단일 데이터 선별하나의 이름 에 따라 필터 방법 으로 name 이 대상 이름 인지 아 닌 지 를 판단 하면 됩 니 다.
//
function filterByName(aim, name) {
return aim.filter(item => item.name == name)
}
// aim 'Leila' [{name:'Leila', age: 16, gender:'female'}]
console.log(filterByName(aim,'leila'))
단일 조건 다 중 데이터 선별여러 이름 에 따라 대상 배열 을 for 순환 으로 옮 겨 다 니 며 find 방법 으로 찾 은 후 push 를 결과 배열 에 넣 고 find 방법 으로 이름 을 바 꾸 는 경우 에 도 원 하 는 결 과 를 얻 을 수 있 습 니 다.for 순환 은 배열 의 일부 옮 겨 다 니 는 방법 으로 대체 할 수 있 습 니 다.코드 는 더욱 간소화 할 수 있 습 니 다.예 를 들 어 대충 의 미 를 표현 하 는 것 입 니 다.
//
function filterByName1(aim, nameArr) {
let result = []
for(let i = 0; i < nameArr.length; i++) {
result.push(aim.find(item => item.name = nameArr[i]))
}
return result
}
// aim ['Anne','Jay']
// [{name:'Anne', age: 23, gender:'female'},{name:'Jay', age: 19, gender:'male'}]
console.log(filterByName1(aim,['Leila','Jay']))
// BUG
다 중 조건 부 단일 데이터 선별단일 이름 이나 단일 연령 에 따라 필터 방법 으로 조건 간 의 예 또는 관 계 를 판단 합 니 다.
//
function filterByName2(aim, name, age) {
return aim.filter(item => item.name == name || item.age == age)
}
console.log(filterByName2(aim,'Leila',19))
다 중 조건 다 중 데이터 선별나 는 처음에 매우 멍청 한 쌍 for 순환 으로 했 는데 매우 느 리 고 기대 하 는 효과 에 이 르 지 못 했다.구체 적 인 심리 과정 이 너무 멀 어서 다음 과 같은 선별 알고리즘 을 간단하게 소개 합 니 다.
우선 선택 조건 을 한 대상 에 넣 고 object 대상 의 keys 방법 으로 선택 한 조건 명 을 얻 고 선택 해 야 할 조건 은 무엇 입 니까?name 입 니까?age? gender?
그리고 filter 방법 으로 대상 데 이 터 를 선별 합 니 다.🌰아래 와 같다⬇️
이름과 나이 에 따라 다 원소 선별
//
export function multiFilter(array, filters) {
const filterKeys = Object.keys(filters)
// filters all elements passing the criteria
return array.filter((item) => {
// dynamically validate all filter criteria
return filterKeys.every(key => {
//ignore when the filter is empty Anne
if(!filters[key].length) return true
return !!~filters[key].indexOf(item[key])
})
})
}
/*
* ,
* :@author https://gist.github.com/jherax
* ,
*/
var filters = {
name:['Leila', 'Jay'],
age:[]
}
/* :
* [{name: "Leila", age: 16, gender: "female"},
* {name: "Jay", age: 19, gender: "male"}]
*/
예 를 들 어 모든 데이터 의 name 값 이 filers.name 배열 에 있 는 지 판단 합 니 다.예 를 들 어 true 로 돌아 갑 니 다.filers.age 가 빈 배열 이 라 고 판단 하면 true 로 돌아 갑 니 다.빈 배열 은 age 조건 이 비 어 있 는 상황 을 모 의 한 것 입 니 다.우 리 는 정확 한 선별 데 이 터 를 얻 을 수 있 습 니 다.지식 포인트 1:Object.key()배열 색인 또는 대상 속성 가 져 오기
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr));
// ["0", "1", "2"]
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj));
// ["0", "1", "2"]
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj));
// ["2", "7", "100"] ?
지식 포인트 2:js 의 falsyfalsy : 0 , false, "", null, undefined, NaN
판단 문 에서 위의 6 가지 상황 만 false 이 고 나머지 는 모두 true 이다.
var a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
//a
}
if(!!a){
//a ...
}
지식 포인트 3:Array.every 와 Array.some 의 차이나의 이 해 는 배열 을 옮 겨 다 닐 때 이다.
4.567917.Array.every 의 조건 은'와'의 관계 이 고 전체 진실 이 며 조건 이 모두 true 이면 true 이 고 false 가 있 으 면 false 로 돌아 갑 니 다
// Anne?
let dataEvery = aim.every(item => item.name === 'Anne') // false
let dataEvery = aim.some(item => item.name === 'Anne') // true
// ?
let dataEvery = aim.every(item => typeof item.name === 'string') // true
let dataEvery = aim.some(item => typeof item.name === 'string') // true
지식 포인트 4:배열 의 깊 은 복사 와 얕 은 복사최근 에 전단 면접 에 참 여 했 는데 깊 은 복사 와 얕 은 복사 가 제 가 가장 즐겨 묻 는 질문 중 하나 입 니 다.한 가지 문 제 는 데이터 유형,배열 조작,재 귀 알고리즘 등 을 고찰 했다.
배열 은 js 의 인용 유형 이기 때문에 단순 복사 할 때 인용 관 계 를 복사 합 니 다.가 져 온 데 이 터 를 선별 할 때 저 는 원시 데이터 에 영향 을 주 고 싶 지 않 습 니 다.그래서 저 는'딥 복사'를 사용 하여 원시 데이터 구조 와 똑 같 고 서로 독립 된 데 이 터 를 얻 으 려 고 합 니 다.인용 관계 만 복사 하 는 것 이 아 닙 니 다.
// , ,
let obj1 = JSON.parse(JSON.stringify(obj))
// deepclone
function deepClone(o1, o2) {
for (let k in o2) {
if (typeof o2[k] === 'object') {
o1[k] = {};
deepClone(o1[k], o2[k]);
} else {
o1[k] = o2[k];
}
}
}
생각해 보 니 재 귀 알고리즘 최적화이 지식 점 은 본문 과 관계 가 크 지 않다.😄 죄송합니다.
이것 은 금 소 책 전단 면접 안내 서 를 보고 알고리즘 을 말 할 때 재 귀 알고리즘 의 최적화 를 제 시 했 고 처음 만 났 을 때 놀 라 서 프로젝트 에 사용 되 지 않 았 습 니 다.관심 있 는 것 은 해 보 세 요.이것 은 피 보 나치 수열 과.브 라 우 저 에서 직접 두 드 려 보 세 요.캐 시 를 사용 하지 않 는 것 과 캐 시 를 사용 하 는 연산 횟수 의 차 이 를 시험 해 보 세 요.
let count = 0;
function fn(n) {
let cache = {};
function _fn(n) {
if (cache[n]) {
return cache[n];
}
count++;
if (n == 1 || n == 2) {
return 1;
}
let prev = _fn(n - 1);
cache[n - 1] = prev;
let next = _fn(n - 2);
cache[n - 2] = next;
return prev + next;
}
return _fn(n);
}
let count2 = 0;
function fn2(n) {
count2++;
if (n == 1 || n == 2) {
return 1;
}
return fn2(n - 1) + fn2(n - 2);
}
JS 구현 배열 필터 에 관 한 간단 한 것 부터 여러 조건 으로 선별 한 글 까지 소개 합 니 다.더 많은 JS 배열 필터 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS 판단 수조 네 가지 실현 방법 상세그러면 본고는 주로 몇 가지 판단 방식과 방식 판단의 원리를 바탕으로 문제가 있는지 토론하고자 한다. 예를 들어 html에 여러 개의 iframe 대상이 있으면 instanceof의 검증 결과가 기대에 부합되지 않을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.