2010-07-14 6 views
12

मेरे पास दो जावास्क्रिप्ट एरे (A और B) हैं जिनमें मैंने बनाए गए ऑब्जेक्ट्स हैं। मैं यह जांचना चाहता हूं कि सरणी A में सभी ऑब्जेक्ट सरणी B में निहित हैं, लेकिन आवश्यक रूप से एक ही क्रम में नहीं हैं।जावास्क्रिप्ट Arrays - ऑर्डर को अनदेखा करने के लिए ऑब्जेक्ट्स के दो एरे की जांच,

ऐसा करने का सबसे अच्छा तरीका क्या है?

संपादित करें:

वे सभी वास्तविक वस्तुओं, नहीं पुरातन हैं, तो मैं (शायद JSON.stringify की तरह कुछ का उपयोग) के साथ-साथ उनकी सामग्री और संरचना की तुलना करने की आवश्यकता होगी।

मैं ऐसा करना चाहता हूं क्योंकि मैं टेस्ट-संचालित विकास सीख रहा हूं, और मैं उन कार्यों का परीक्षण करना चाहता हूं जो वस्तुओं की सूचियां लौटाते हैं। मुझे यह जांचने की ज़रूरत है कि लौटाई गई सूचियों में उनमें अपेक्षित वस्तुएं हैं या नहीं (आदेश इस मामले में कोई फर्क नहीं पड़ता)।

+2

क्या वे 'सत्य', 'झूठी', '23' या वास्तविक वस्तुओं जैसे प्राइमेटिव हैं? क्या आप यह भी समझा सकते हैं कि आप ऐसा क्यों करना चाहते हैं? एक बेहतर तरीका हो सकता है। – ChaosPandion

+0

स्पष्टीकरण के लिए संपादित प्रश्न। – Chetan

+0

पहले क्रमबद्ध क्यों नहीं करें और फिर – Xinus

उत्तर

2

उपयोग:isEqArrays(arr1, arr2)

// 
// Array comparsion 
// 

function inArray(array, el) { 
    for (var i = array.length; i--;) { 
    if (array[i] === el) return true; 
    } 
    return false; 
} 

function isEqArrays(arr1, arr2) { 
    if (arr1.length !== arr2.length) { 
    return false; 
    } 
    for (var i = arr1.length; i--;) { 
    if (!inArray(arr2, arr1[i])) { 
     return false; 
    } 
    } 
    return true; 
} 
+0

क्या यह @ कैओसपैंडियन के समाधान से तेज़ है? – Chetan

+0

यह क्रॉस ब्राउज़र है। कैओस नहीं है। वह भाषा सुविधाओं का उपयोग करता है जो अभी तक समर्थित नहीं हैं। – galambalazs

+1

यह कोड काम नहीं करता है: 'isEqArrays ([0, 0, 1], [0, 1, 1])' 'सत्य 'देता है। – callum

1

यह शायद सबसे आसान तरीका है यदि सबसे धीमा नहीं है।

var o = { PropA: 1, PropB: 2 }; 
var a = [1, 2, 3, 4, o]; 
var b = [2, 3, 4, 1]; 

var c = a.filter(function(value, index, obj) { 
    return b.indexOf(value) > -1; 
}); 

if (c.length !== a.length) { 
    throw new Error("Array b is missing some elements!"); 
} 

indexOf केवल यह जांच करेगा कि वे एक ही ऑब्जेक्ट को संदर्भित करते हैं। यदि आप मूल्य समकक्ष की जांच करना चाहते हैं तो आपको गुणों की गहरी तुलना करना होगा या JSON.stringify का उपयोग करना होगा जैसा कि आप अपने प्रश्न में उल्लेख करते हैं।

+0

क्या ऑब्जेक्ट समतुल्यता के लिए 'indexOf' जांचता है? जैसा कि, यदि मैं 'o2 = {Propa: 2, PropB: 2}' बना देता हूं और इसे 'b' में डालता हूं, तो क्या यह' -1' के अलावा कुछ और लौटाएगा? – Chetan

+0

@ खेतान - अपडेट देखें। – ChaosPandion

+0

दूसरे उत्तर के साथ, यह '[0, 1, 1]' और '[0, 0, 1]' के लिए झूठी सकारात्मक देता है। – callum

2

डुप्लिकेट भी कोई फर्क नहीं है, तो आप lodash का उपयोग करके एक-लाइनर्स बना सकते हैं। देखो कि दो सरणी के बीच का अंतर खाली है या नहीं।

if (_(array_1).difference(array_2).isEmpty()) { 
    // is equal ignoring order and duplicates 
} 

console.log(_([1,2,3]).difference([2,3,1]).isEmpty()) // -> true 
console.log(_([1,2,3,3]).difference([2,3,1,1]).isEmpty()) // -> also true