2016-01-20 21 views
34


मैं का सबसे अच्छा तरीका समझना चाहता हूं कि किसी अन्य के सभी तत्वों से एक सरणी फ़िल्टर करें। मैंने फ़िल्टर फ़ंक्शन के साथ प्रयास किया, लेकिन यह मेरे पास नहीं आया है कि इसे उन मूल्यों को कैसे दिया जाए जिन्हें मैं निकालना चाहता हूं।
कुछ की तरह:किसी अन्य सरणी के सभी तत्वों से किसी सरणी को फ़िल्टर करने के लिए कैसे करें

var array = [1,2,3,4]; 
var anotherOne = [2,4]; 
var filteredArray = array.filter(myCallback); 
// filteredArray should now be [1,3] 


function myCallBack(){ 
    return element ! filteredArray; 
    //which clearly can't work since we don't have the reference <,< 
} 
केस फ़िल्टर समारोह उपयोगी नहीं है

, तो आप इस कैसे लागू होगा?
संपादित करें: मैंने संभावित डुप्लिकेट प्रश्न की जांच की है, और यह उन लोगों के लिए उपयोगी हो सकता है जो आसानी से जावास्क्रिप्ट को समझते हैं। अच्छे के रूप में चेक किया गया जवाब चीजों को आसान बनाता है।

+4

है कॉलबैक को फ़िल्टर और उपयोग करने के लिए अन्य सरणी दर्रा 'लौट arrTwo .indexOf (ई) === -1; '** कोड: **' var filteredArr = firstArr.filter (el => secondArr.indexOf (el) === -1); ' – Tushar

+1

[.filter का संभावित डुप्लिकेट() सरणी एक और सरणी तत्वों का उपयोग कर] (http://stackoverflow.com/questi ऑन/7353917/फिल्टर-सरणी-का उपयोग-अन्य-सरणी-तत्व) –

+0

दोनों सरणी आदेश दिए गए हैं? –

उत्तर

43

आप एक वैश्विक चर में अपने फ़िल्टर सरणी स्टोर करने के लिए से बचने के लिए फिल्टर() फ़ंक्शन का "इस" पैरामीटर का उपयोग कर सकते हैं।

var filtered=[1,2,3,4].filter(function(e){return this.indexOf(e)<0;},[2,4]); 
+0

यह एक आकर्षण की तरह काम करता है। क्या फ़ंक्शन को बाहर ले जाना संभव है और इसे अधिक समझने योग्य तरीके से कॉल करना संभव है? पसंद: var फ़िल्टर = [1,2,3,4]। फिल्टर (myfunct(), [2,4]); – Koop4

+0

निश्चित: var myFunct = function (e) {this.indexOf (e) <0;}; var फ़िल्टर = [1,2,3,4]। फ़िल्टर (myFunct, [2,4]); –

+0

क्या यह ES2016 या टाइपस्क्रिप्ट में लैम्ब्डा अभिव्यक्ति के साथ हासिल किया जा सकता है? –

0

आप सेटअप कर सकते हैं असाइन किया गया है आप चर मूल्य उपयोग नहीं कर सकते फिल्टर फ़िल्टर "फिल्टर सरणी" पर पुनरावृत्त करने के लिए।

var arr = [1, 2, 3 ,4 ,5, 6, 7]; 
var filter = [4, 5, 6]; 

var filtered = arr.filter(
    function(val) { 
    for (var i = 0; i < filter.length; i++) { 
     if (val == filter[i]) { 
     return false; 
     } 
    } 
    return true; 
    } 
); 
17
var array = [1,2,3,4]; 
var anotherOne = [2,4]; 
var filteredArray = array.filter(myCallBack); 

function myCallBack(el){ 
    return anotherOne.indexOf(el) < 0; 
} 

कॉलबैक में, आप आप lodash.js उपयोग कर रहे हैं, तो array के प्रत्येक मान anotherOne

https://jsfiddle.net/0tsyc1sx/

में है की जाँच करें, का उपयोग _.difference

filteredArray = _.difference(array, anotherOne); 

Demo

आप वस्तुओं की एक सरणी है:

var array = [{id :1, name :"test1"},{id :2, name :"test2"},{id :3, name :"test3"},{id :4, name :"test4"}]; 

var anotherOne = [{id :2, name :"test2"}, {id :4, name :"test4"}]; 

var filteredArray = array.filter(function(array_el){ 
    return anotherOne.filter(function(anotherOne_el){ 
     return anotherOne_el.id == array_el.id; 
    }).length == 0 
}); 

Demo array of objects

Demo diff array of objects with lodash

+0

हाय क्या आप वस्तुओं की सरणी में इसे विस्तारित कर सकते हैं? मैं अत्यधिक सराहना करता हूं –

+0

क्या आप lodash का उपयोग कर रहे हैं? – AshBringer

+0

कोई सर मैं कॉलबैक विधि –

1

आप फिल्टर समारोह के लिए तो फिल्टर का उपयोग कर सकते हैं और छानने सरणी जो की जाँच करता है की कमी का उपयोग करें और जब यह एक मैच पाता है तो वापस लौटाता है तो वापसी (!) पर उलटा होता है। फ़िल्टर फ़ंक्शन को सरणी में प्रति तत्व एक बार कहा जाता है। आप अपनी पोस्ट में फ़ंक्शन में किसी भी तत्व की तुलना नहीं कर रहे हैं।

var a1 = [1, 2, 3, 4], 
 
    a2 = [2, 3]; 
 

 
var filtered = a1.filter(function(x) { 
 
    return !a2.reduce(function(y, z) { 
 
    return x == y || x == z || y == true; 
 
    }) 
 
}); 
 

 
document.write(filtered);

0

var arr1= [1,2,3,4]; 
 
var arr2=[2,4] 
 

 
function fil(value){ 
 
return value !=arr2[0] && value != arr2[1] 
 
} 
 

 
document.getElementById("p").innerHTML= arr1.filter(fil)
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
</head> 
 
<body> 
 
<p id="p"></p>

+0

धन्यवाद, यह काम करता है, लेकिन मैं स्थानीय दायरा रखना पसंद करूंगा। इसके अलावा arr2 में तत्वों की एक यादृच्छिक संख्या है। – Koop4

0

function arr(arr1,arr2){ 
 
    
 
    function filt(value){ 
 
    return arr2.indexOf(value) === -1; 
 
    } 
 
    
 
    return arr1.filter(filt) 
 
    } 
 

 
document.getElementById("p").innerHTML = arr([1,2,3,4],[2,4])
<p id="p"></p>

20

मैं इस प्रकार करना होगा;

var arr = [1,2,3,4], 
 
    brr = [2,4], 
 
    res = arr.filter(f => !brr.includes(f)); 
 
console.log(res);

+2

रॉकस्टार। धन्यवाद, यह थोड़ा अलग समस्या को हल करने के लिए अविश्वसनीय रूप से सहायक था। प्रतिक्रिया घटक में मानों की सरणी के आधार पर ऑब्जेक्ट्स की एक सरणी फ़िल्टर करना: '' 'कॉन्स्ट फ़िल्टर किए गए परिणाम = this.state.cards।फ़िल्टर ( परिणाम =>! this.state.filterOut.includes (result.category) ) '' 'जहां यह .state.cards ऑब्जेक्ट्स की एक सरणी में है और this.state.filterOut उन मानों की एक सरणी है जो ' ऑब्जेक्ट्स में श्रेणी 'कुंजी जिसे मैं निकालना चाहता था। –

1

एक और सरणी से एक और अधिक लचीला छानने सरणी जो वस्तु गुण

function filterFn(array, diffArray, prop, propDiff) { 
 
    diffArray = !propDiff ? diffArray : diffArray.map(d => d[propDiff]) 
 
    this.fn = f => diffArray.indexOf(f) === -1 
 
    if (prop) { 
 
     return array.map(r => r[prop]).filter(this.fn) 
 
    } else { 
 
     return array.filter(this.fn) 
 
    } 
 
} 
 

 
//You can use it like this; 
 

 
var arr = []; 
 

 
for (var i = 0; i < 10; i++) { 
 
    var obj = {} 
 
    obj.index = i 
 
    obj.value = Math.pow(2, i) 
 
    arr.push(obj) 
 
} 
 

 
var arr2 = [1, 2, 3, 4, 5] 
 

 
var sec = [{t:2}, {t:99}, {t:256}, {t:4096}] 
 

 
var log = console.log.bind(console) 
 

 
var filtered = filterFn(arr, sec, 'value', 't') 
 

 
var filtered2 = filterFn(arr2, sec, null, 't') 
 

 
log(filtered, filtered2)

0

आप एक सामान्य filterByIndex() फ़ंक्शन लिख सकते हैं और उपयोग कर सकते हैं शामिल कॉलबैक के साथ परेशानी को बचाने के लिए टीएस में टाइप अनुमान के फ़ंक्शन:

मान लें कि आपके पास [2,4] सरणी है जो आप [2,4] सरणी में निर्दिष्ट सूचकांक के साथ फ़िल्टर करना चाहते हैं।

var filtered = [1,2,3,4,].filter(byIndex(element => element, [2,4])) 

byIndex समारोह तत्व समारोह और एक सरणी की उम्मीद है और इस तरह दिखता है:

byIndex = (getter: (e:number) => number, arr: number[]) => (x: number) => { 
    var i = getter(x); 
    return arr.indexOf(i); 
} 

परिणाम तो

filtered = [1,3] 
संबंधित मुद्दे

 संबंधित मुद्दे