2012-02-09 27 views
22

में एकाधिक मान मौजूद हैं या नहीं, इसलिए, मैं jquery का उपयोग कर रहा हूं और कई मानों के साथ दो एरे हैं और मैं यह जांचना चाहता हूं कि सभी पहले सरणी में मान दूसरे में मौजूद हैं।यह जांचने के लिए कि जावास्क्रिप्ट सरणी

उदाहरण है, उदाहरण के लिए 1 ...

सरणी एक निम्न मान

34, 78 में शामिल है, 89

सरणी बी निम्न मान

78, 67 में शामिल , 34, 99, 56, 89

यह सचवापस आ जाएगा

... उदाहरण 2:

सरणी एक निम्न मान

34, 78 में शामिल है, 89

सरणी बी निम्न मान

78 होता है, 67, 99, 56, 89

यहवापस आ जाएगाझूठी

... उदाहरण 3:

सरणी एक होता है निम्न मान

34, 78, 89

सरणी बी निम्नलिखित मान शामिल

78, 89

यह वापसी होगी झूठी

अब तक मैं द्वारा इस समस्या के समाधान की कोशिश की है:

  1. Jquery with a custom 'compare' method विस्तार दो सरणियों की तुलना। समस्या यह केवल सच जब सरणियों समान हैं देता है और जैसा कि आप उदाहरण 1 से देख सकते हैं मैं यह सच लौटने के लिए भले ही वे समान नहीं हैं लेकिन कम से कम मूल्य
  2. Jquerys .inArray function का उपयोग कर होते हैं, चाहते हैं, लेकिन यह केवल चेकों है एक सरणी में एक मान के लिए, एकाधिक नहीं।

कोई भी प्रकाश जो इस पर फेंक सकता है वह बहुत अच्छा होगा।

उत्तर

44
function containsAll(needles, haystack){ 
    for(var i = 0 , len = needles.length; i < len; i++){ 
    if($.inArray(needles[i], haystack) == -1) return false; 
    } 
    return true; 
} 

containsAll([34, 78, 89], [78, 67, 34, 99, 56, 89]); // true 
containsAll([34, 78, 89], [78, 67, 99, 56, 89]); // false 
containsAll([34, 78, 89], [78, 89]); // false 
+0

शानदार - यह काम कर देता है। धन्यवाद। – Betjamin

+0

बहुत बढ़िया, धन्यवाद! –

+4

देशी समाधान बहुत बेहतर है – andygoestohollywood

45

मूल निवासी जावास्क्रिप्ट समाधान

var success = array_a.every(function(val) { 
    return array_b.indexOf(val) !== -1; 
}); 

अगर आप IE8 सहित पुराने ब्राउज़र, समर्थन कर रहे हैं आप every और indexOf के लिए संगतता पैच की आवश्यकता होगी।


पूर्ण jQuery समाधान

var success = $.grep(array_a, function(v,i) { 
    return $.inArray(v, array_b) !== -1; 
}).length === array_a.length; 

$.inArray साथ $.grep उपयोग करता है।


ES2015 समाधान

देशी समाधान ऊपर ES2015 के तीर समारोह वाक्य रचना और उसके .includes() विधि का उपयोग कर छोटा किया जा सकता:

let success = array_a.every((val) => array_b.includes(val)) 
+0

i (अनुक्रमणिका) चर अप्रयुक्त है और इसकी आवश्यकता नहीं है (कम से कम जेएस समाधान के लिए) – jpoppe

+1

@jpoppe: हाँ, उस परम को elided किया जा सकता है। मेरे उत्तर * समुदाय विकी * हैं, इसलिए सुधार और जोड़ों को मुक्त करने के लिए स्वतंत्र महसूस करें, जब तक मूल उद्देश्य का सम्मान किया जाता है। –

+0

बहुत बढ़िया, ईएस 6 समाधान के लिए +1 –

0

आप इस सरल कार्य का उपयोग कर सकते हैं (नाम बदला चर आसान पढ़ने के लिए उपर्युक्त उत्तर के अनुसार):

function contains(haystack, needles) { 

    return needles.map(function (needle) { 
     return haystack.indexOf(needle); 
    }).indexOf(-1) == -1; 
} 
0

इसे आजमाएं।

var arr1 = [34, 78, 89]; 
var arr2 = [78, 67, 34, 99, 56, 89]; 

var containsVal = true; 
$.each(arr1, function(i, val){ 
    if(!$.inArray(val, arr2) != -1){ 
     retVal = false; 
     return false; 
    } 
}); 

if(containsVal){ 
    //arr2 contains all the values from arr1 
} 
13

मैंने देखा है कि प्रश्न jQuery के साथ इस को हल करने के बारे में है, लेकिन अगर किसी और को जो jQuery तक सीमित नहीं है चारों ओर आता है तो अंडरस्कोर js का उपयोग कर एक सरल उपाय है।

अंडरस्कोर js का उपयोग करके आप कर सकते हैं:

_.intersection(ArrayA, ArrayB).length === ArrayA.length; 

डॉक्स से:

intersection_.intersection (* सरणियों) मूल्यों है कि सभी सरणियों के चौराहे की सूची गणना करता है। परिणाम में प्रत्येक मान प्रत्येक सरणी में मौजूद है।

_.intersection ([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2]

Ergo, अगर ArrayA की एक वस्तु के ArrayB में याद आ रही थी, तो चौराहे ArrayA की तुलना में कम हो जाएगा।

3

एक-लाइनर यह जांचने के लिए कि arr1 में सभी तत्व arr2 में मौजूद हैं ...

ES6 साथ

: ES6 बिना

var containsAll = arr1.every(i => arr2.includes(i)); 

:

var containsAll = arr1.every(function (i) { return arr2.includes(i); }); 
संबंधित मुद्दे