2012-11-10 14 views
5

तो कुछ घंटों के लिए इंटरवेज खोजने के बाद मुझे वह समाधान नहीं मिला है जिसे मैं ढूंढ रहा हूं।जावास्क्रिप्ट में ऑब्जेक्ट्स के ऐरे का संघ?

मेरे पास दो सरणी हैं जिनमें बहुत सारी जानकारी के साथ गेम ऑब्जेक्ट्स हैं। (उदा। शीर्षक, स्लग, थंबनेल, सारांश, शैली, रिलीज दिनांक ...)।

सरणी 1 वस्तुओं है कि उपयोगकर्ताओं की रुचि के पंजीकरण के दौरान निर्दिष्ट मेल खाते का एक संग्रह है।

सरणी 2 वस्तुओं है कि खरीदी समान प्रयोक्ताओं की खेल मैच का एक संग्रह है। (इसी तरह के उपयोगकर्ता सामान्य हितों को साझा करते हैं)

समस्या: यह संभव है, और मेरे मामले में क्या हो रहा है, दो समान खेल हैं - ऐरे 1 में गेम भी ऐरे 2 में है। पहले में सरणी खेल है क्योंकि यह उपयोगकर्ता के हितों से मेल खाता है। दूसरी सरणी में गेम वहां है क्योंकि एक समान उपयोगकर्ता ने उस गेम को खरीदा है।

प्रश्न: Underscore.js एक अच्छी छोटी समारोह संघ() http://underscorejs.org/#union है कि आप दो सरणियों का एक संघ देता है, लेकिन यह वस्तुओं की एक सरणी, केवल आदिम मूल्यों पर साथ काम नहीं करता। मैं इसे कैसे काम कर सकता हूं मुझे वस्तुओं की सरणी का एक संघ प्रदान करता है?

+0

तो क्या आप की जरूरत है एक गहरी मर्ज और विस्तार है? https://gist.github.com/1868955 http://stackoverflow.com/questions/7549574/merge-js-objects-without-overwriting http://stackoverflow.com/questions/896043/how-can-i- विलय -2-जावास्क्रिप्ट-ऑब्जेक्ट्स-पॉपुलटिंग-द-प्रॉपर्टी-इन-वन-अगर-वे-डी – jcolebrand

+0

http://phrogz.net/JS/ArraySetMath.js – Phrogz

+1

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

उत्तर

14

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

// arr1 and arr2 are arrays of any length; equalityFunc is a function which 
// can compare two items and return true if they're equal and false otherwise 
function arrayUnion(arr1, arr2, equalityFunc) { 
    var union = arr1.concat(arr2); 

    for (var i = 0; i < union.length; i++) { 
     for (var j = i+1; j < union.length; j++) { 
      if (equalityFunc(union[i], union[j])) { 
       union.splice(j, 1); 
       j--; 
      } 
     } 
    } 

    return union; 
} 

function areGamesEqual(g1, g2) { 
    return g1.title === g2.title; 
} 

// Function call example 
arrayUnion(arr1, arr2, areGamesEqual); 

विभिन्न ऑब्जेक्ट तुलना कार्यान्वयन के लिए Object comparison in JavaScript का संदर्भ लें। अंडरस्कोर का उपयोग का विस्तार, आप कर सकते हैं

$.extend(true, object1, object2); 
+0

मुझे इसे मारो। अच्छा कार्यान्वयन। – L0j1k

+0

हम्म इसे काम करने के लिए कोई भाग्य नहीं है। अपरिभाषित रिटर्न। https://gist.github.com/4049901 –

+0

हाँ, यह असुरक्षित है जब मैं एक मूल्य 'वापसी' भूल गया था। :) संपादन। –

1

jQuery विधि extend है।

+0

तो underscore.js करता है, लेकिन मैं एक यूनियन ऑपरेशन की तलाश में था। जो कुछ मैं समझता हूं उससे विस्तार करें दो वस्तुओं को विलय करने के लिए। मैं पूरी तरह से सरणी में है, तो मैं पूरी तरह से एक वस्तु को खत्म करना चाहता हूँ। मुझे लगता है कि आप विस्तार() का उपयोग कर सकते हैं, यह सिर्फ मेरे मन में पहली बात नहीं थी। –

2

: सूची खाली हो सकता है

var objects = [{ bar : 1, nuts : 2} , {foo : 3, nuts : 4}] 
_.extend.apply(this,objects) 

है, यह करने के लिए एक खाली वस्तु संलग्न करने के लिए सुनिश्चित करें कि

4

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

// collectionUnion(*arrays, iteratee) 
function collectionUnion() { 
    var args = Array.prototype.slice.call(arguments); 
    var it = args.pop(); 

    return _.uniq(_.flatten(args, true), it); 
} 

यह सिर्फ मूल कार्य _.union(*arrays) के improvment, संग्रह (वस्तु की सरणी) काम करने के लिए एक iteratee जोड़ने।

यहाँ

कि यह कैसे उपयोग करने के लिए:

var result = collectionUnion(a, b, c, function (item) { 
    return item.id; 
}); 

मूल कार्य जो सिर्फ सरणी के साथ काम कर रहा है, कि जैसा दिखता है:

_.union = function() { 
    return _.uniq(flatten(arguments, true, true)); 
}; 

और बोनस में एक पूर्ण उदाहरण:

// collectionUnion(*arrays, iteratee) 
function collectionUnion() { 
    var args = Array.prototype.slice.call(arguments); 
    var it = args.pop(); 

    return _.uniq(_.flatten(args, true), it); 
} 

var a = [{id: 0}, {id: 1}, {id: 2}]; 
var b = [{id: 2}, {id: 3}]; 
var c = [{id: 0}, {id: 1}, {id: 2}]; 

var result = collectionUnion(a, b, c, function (item) { 
    return item.id; 
}); 

console.log(result); // [ { id: 0 }, { id: 1 }, { id: 2 }, { id: 3 } ] 
+0

संग्रह संघ में (अंतिम बोनस एक पूर्ण उदाहरण) मैं उपयोग करूंगा: '_.uniqBy (_। Flatten (args, true), 'prop-id') 'https://lodash.com/docs/4.17.4 #uniqBy – Crisboot

1

Set (ES6/ES2015) आपकी मदद करेगा।

const info1 = {id: 1} 
 
const info2 = {id: 2} 
 
const info3 = {id: 3} 
 

 
const array1 = [info1, info2] 
 
const array2 = [info1, info3] 
 

 
const union = [...new Set([...array1, ...array2])] 
 

 
console.log(union)

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