2017-05-12 1 views
3

"Flexbox"라는 텍스트가 포함되어 있으면 목록 항목의 배열을 반환하려합니다.필터가 함수가 아닙니다.

임이 오류가 : Uncaught TypeError: items.filter is not a function

<ul> 
     <li data-time="5:10">Flexbox 1</li> 
     <li data-time="5:10">Something else</li> 
     <li data-time="5:40">Flexbox 2</li> 
     <li data-time="5:10">Something also else</li> 
     <li data-time="5:40">More Flexbox for you</li> 
    </ul> 


'use strict'; 

var items = document.querySelectorAll('li'); 

var itemsFlex = items.filter(function(item) { 
    return item.includes('Flexbox') 
}); 

console.log(itemsFlex); 
+0

매우 좋은 질문입니다. 이유는 처음보기에는보기 힘들지만 반환 유형을 분석하면 NodeList가 querySelectorAll 메서드에서 반환하는 유형임을 알 수 있습니다. –

답변

8

querySelectorAllNodeList 아닌 Array 반환합니다. 배열 메서드를 사용하려면 배열로 변환 할 수 있습니다.

var items = document.querySelectorAll('li'); 
var itemsArray = Array.from(items); 
+1

독자는 모든 브라우저가 IE11 표준 모드에서, 당신이 아니더라도)'Array.from'를 지원합니다. – DocMax

+0

짧고 달콤한! 고마워, 그것은 많은 도움이되었다! 그리고 확실하게 될 것입니다 –

1

이유는 querySelectorAll이 배열을 반환하지 않기 때문입니다.

당신은을 통해 배열로 노드 목록을 변환 할 수있는 (https://davidwalsh.name/nodelist-array

+0

그건 순수한 사실입니다! 때때로 이런 종류의 방법으로 그것을 깨닫는 것이 어렵습니다. 당신에게서 영리합니다. –

2

querySelectorAllarray을 반환하지 않는, 즉 filter가 정의되어 있지 않은 이유입니다 :

var itemsArray = Array.prototype.slice.call(document.querySelectorAll("li"));

소스가 array의 기능). 이 경우 filter 함수를 Array.prototype에서 호출하고 textContent.indexOf(string)을 사용하여 요소에 원하는 텍스트 콘텐츠 (Flexbox)가 있는지 확인해야합니다. 샘플의 경우 :

var items = document.querySelectorAll('li'); 
var filter = Array.prototype.filter; 

var itemsFlex = filter.call(items, function(item) { 
    return item.textContent.indexOf('Flexbox') >= 0; 
}); 

console.log(itemsFlex); 

여기에 샘플을 참조하십시오 : https://jsbin.com/hibixipoyo/edit?html,js,output

+0

완벽한 답변입니다! 정말 공유 주셔서 감사합니다. –

0

document.querySelectorAll()NodeList 반환합니다. NodeLists 배열과 같은 그러나 당신, 당신은 배열에 노드 목록을 변환해야이 기능을 사용할 경우 등 대해 forEach,지도, 필터, 처럼 Array에서 제공하는 방법의 많은 기능하지 않습니다

var nodesArray = [].slice.call(document.querySelectorAll('li')); 
+0

* "like forEach"* - NodeLists * do *는 이전 브라우저에서는 지원되지 않지만'.forEach()'메소드를 포함합니다. (나는 IE의 어떤 버전이 그것을 지원한다고 생각하지 않는다.) – nnnnnn

관련 문제