2013-10-20 5 views
15

द्वारा जावास्क्रिप्ट विलय ऑब्जेक्ट्स जावास्क्रिप्ट में दो सरणी मर्ज करने का सही तरीका क्या है?आईडी

मैं दो सरणियों (उदाहरण के लिए) मिल गया है:

var a3 = [{ id : 1, name : "test", count : "1"}, 
      { id : 2, name : "test2", count : "2"}] 

कहाँ दो सरणियों के आधार पर किया जा रहा है में शामिल हो गए:

var a1 = [{ id : 1, name : "test"}, { id : 2, name : "test2"}] 
var a2 = [{ id : 1, count : "1"}, {id : 2, count : "2"}] 

मैं की तरह कुछ के साथ समाप्त करने के लिए सक्षम होना चाहते हैं 'आईडी' फ़ील्ड और अतिरिक्त डेटा बस जोड़ा जा रहा है।

मैं _.union उपयोग करने के लिए यह करने के लिए कोशिश की, लेकिन यह केवल आप इस

function mergeObject(cake, icing) { 
    var icedCake = {}, ingredient; 
    for (ingredient in cake) 
     icedCake[ingredient] = cake[ingredient]; 
    for (ingredient in icing) 
     icedCake[ingredient] = icing[ingredient]; 
    return icedCake; 
} 

अगला की तरह एक साधारण वस्तु विलय समारोह लिख सकते हैं पहले एक

+1

तो आप वास्तव में क्या करना चाहते हैं वस्तुओं को मर्ज करना है। – JJJ

+0

आपका वाक्यविन्यास अमान्य है। क्या आपके पास कानूनी उदाहरण है? –

+0

http://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript –

उत्तर

29

इस चाल करना चाहिए: के बजाय "2"

+0

परफेक्ट देखें , धन्यवाद – Tam2

+1

यह काम नहीं करेगा अगर ए 2 में ए 1 की तुलना में सरणी में अधिक आइटम हैं। – CAOakley

+1

@CAOakley - हाँ यह होगा। आपको क्या लगता है कि यह काम नहीं करता है? –

0

में दूसरी सरणी से मान अधिलेखित कर देता है, आप एक डबल पाश का उपयोग अपने डेटा structre पर लागू करने का

var i, j, a3 = a1.slice(); 
for (i = 0; i < a2.length; ++i)    // for each item in a2 
    for (j = 0; i < a3.length; ++i)   // look at items in other array 
     if (a2[i]['id'] === a3[j]['id'])  // if matching id 
      a3[j] = mergeObject(a3[j], a2[i]); // merge 

तुम भी एक सरल क्लोन के रूप में उपयोग कर सकते हैं mergeObject ऐसा करने के लिए, भी जरूरत है , एक पैरामीटर को खाली ऑब्जेक्ट के रूप में पास करके।

11

मान लिया जाये कि आईडी तार कर रहे हैं और क्रम मायने नहीं रखता

var mergedList = _.map(a1, function(item){ 
    return _.extend(item, _.findWhere(a2, { id: item.id })); 
}); 

मतलब यह है कि a1 में दूसरी वस्तु का पता होना चाहिए 2 , आप

  1. एक हैश तालिका बनाएं।
  2. दोनों सरणी को दोहराएं और आईडी द्वारा अनुक्रमित हैश तालिका में डेटा स्टोर करें। यदि उस आईडी के साथ पहले से कुछ डेटा है, तो इसे Object.assign (ES6, polyfilled हो सकता है) के साथ अपडेट करें।
  3. हैश मानचित्र के मानों के साथ एक सरणी प्राप्त करें।
var hash = Object.create(null); 
a1.concat(a2).forEach(function(obj) { 
    hash[obj.id] = Object.assign(hash[obj.id] || {}, obj); 
}); 
var a3 = Object.keys(hash).map(function(key) { 
    return hash[key]; 
}); 

ECMAScript6 में, यदि आईडी जरूरी तार नहीं हैं, आप Map उपयोग कर सकते हैं:

var hash = new Map(); 
a1.concat(a2).forEach(function(obj) { 
    hash.set(obj.id, Object.assign(hash.get(obj.id) || {}, obj)) 
}); 
var a3 = Array.from(hash.values()); 
3

reduce संस्करण।

var a3 = a1.concat(a2).reduce((acc, x) => { 
    acc[x.id] = Object.assign(acc[x.id] || {}, x); 
    return acc; 
}, {}); 
_.values(a3); 

मुझे लगता है कि यह कार्यात्मक भाषा में सामान्य प्रथा है।

4

lodash implementaiton:

var merged = _.map(a1, function(item) { 
    return _.assign(item, _.find(a2, ['id', item.id])); 
}); 

परिणाम:

[ 
    { 
     "id":1, 
     "name":"test", 
     "count":"1" 
    }, 
    { 
     "id":2, 
     "name":"test2", 
     "count":"2" 
    } 
] 
1

पहले से ही कई महान जवाब मैं सिर्फ एक और एक है जो एक वास्तविक समस्या से है मैं कल का समाधान करने के लिए आवश्यक जोड़ देंगे कर रहे हैं, ।

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

var messages = [{userId: 2, content: "Salam"}, {userId: 5, content: "Hello"},{userId: 4, content: "Moi"}]; 
var users = [{id: 2, name: "Grace"}, {id: 4, name: "Janetta"},{id: 5, name: "Sara"}]; 

var messagesWithUserNames = messages.map((msg)=> { 
    var haveEqualId = (user) => user.id === msg.userId 
    var userWithEqualId= users.find(haveEqualId) 
    return Object.assign({}, msg, userWithEqualId) 
}) 
console.log(messagesWithUserNames)