2016-11-12 7 views
5

कहो, मैं एक वस्तु है:जावास्क्रिप्ट में किसी ऑब्जेक्ट से कुछ गुणों की प्रतिलिपि बनाने का सबसे प्रभावी तरीका क्या है?

const newUser = {firstName: 'John', lastName: 'Smith'} 

मैं इस का उपयोग कर रहा:

const user = {_id: 1234, firstName: 'John', lastName: 'Smith'} 

मैं बिना _id कुंजी किसी अन्य वस्तु का निर्माण करना चाहते

const newUser = Object.assign({}, {firstName: user.firstName, lastName: user.lastName}) 

कोई बेहतर है ऐसा करने का तरीका?

उत्तर

5

आप destructuring के साथ प्राप्त कर सकते हैं और बाकी गुण वस्तु:

const user = {_id: 1234, fistName: 'John', lastName: 'Smith'} 
const {_id, ...rest} = user; 
console.log(rest); 

हालांकि rest/rpread properties एक ecmascript's proposal (चरण 3 में वर्तमान में) अभी भी कर रहे हैं। आप इसे बैबेल जैसे ट्रांसमिशन परत के साथ उपयोग कर सकते हैं।

4

Array#reduce विधि Object.keys विधि के साथ करें।

const user = { 
 
    _id: 1234, 
 
    fistName: 'John', 
 
    lastName: 'Smith' 
 
}; 
 

 
var res = Object.keys(user).reduce(function(obj, k) { 
 
    if (k != '_id') obj[k] = user[k]; 
 
    return obj; 
 
}, {}); 
 

 
console.log(res);

+2

मुझे आश्चर्य है कि यह ओपी द्वारा किए गए असाइनमेंट से तेज़ कैसे हो सकता है। – trincot

+1

@trincot - सवाल क्यों नहीं पढ़ते हैं, यह कहता है * "मैं' _id' कुंजी "के बिना एक और वस्तु बनाना चाहता हूं, और फिर ओपी उस वस्तु को दिखाता है जो अपेक्षित परिणाम है, और कहता है कि वह उपयोग कर रहा है 'ऑब्जेक्ट.साइन', जो प्रत्यक्ष अनुलग्नक नहीं है। – adeneo

+0

दरअसल, 'ऑब्जेक्ट.साइन' ओपी के कोड में निश्चित रूप से अनिवार्य है। – trincot

0

सबसे कुशल सबसे अधिक संभावना एक नियमित रूप से पाश

const user = {_id: 1234, fistName: 'John', lastName: 'Smith'}; 
 
let obj = {}, key; 
 

 
for (key in user) { 
 
    if (key !== '_id') obj[key] = user[key]; 
 
} 
 

 
console.log(obj)

+1

ओपी द्वारा किए गए प्रत्यक्ष असाइनमेंट से लूप कैसे तेज हो सकता है? – trincot

+0

@trincot - 'Object.assign'" प्रत्यक्ष सत्यापन "नहीं है, यह एक आंतरिक विधि है जो पुनरावृत्त करता है, कुछ जांच करता है, और एक नई वस्तु बनाता है, और यह बहुत कुशल नहीं है -> ** https: //jsperf.com/ वस्तु की नकल दक्षता-s **। बेशक, यदि ओप ** प्रत्यक्ष प्रत्यक्षता का उपयोग कर सकता है, और सीधे चाबियों का संदर्भ दे सकता है, तो यह तेज़ है, लेकिन यह अन्य उत्तरों की तरह '_id' प्रॉपर्टी को छोड़ देता है, और मानता है कि कोई हमेशा नहीं चाहता सभी चाबियों का उपयोग करें। – adeneo

+0

दरअसल, 'ऑब्जेक्ट.साइन' ओपी के कोड में निश्चित रूप से अनिवार्य है। – trincot

1

आप एक उथले प्रति दो बार ले जा रहे हैं होगा: एक बार वस्तु शाब्दिक के साथ, और फिर Object.assign साथ। तो बस के पहले का उपयोग दो:

const newUser = {firstName: user.firstName, lastName: user.lastName}; 
3

अन्य उत्तर के लिए एक वैकल्पिक निर्दिष्ट साथ destruct syntax उपयोग करने के लिए जो गुण कॉपी करने के लिए है:

const user = { _id: 1234, firstName: 'John', lastName: 'Smith' } 

const newUser = { firstName, lastName } = user 

लिस्टिंग गुण कभी कभी बेहतर हो सकता है विकल्प क्योंकि यह को समझने में मदद करता है जो गुणों की प्रतिलिपि होगी। विशेष रूप से अगर हम तुरंत स्रोत कोड में नहीं देख सकते हैं जो मूल वस्तु के गुण हैं।

+0

दूसरी पंक्ति आपके विचार के तरीके से काम नहीं करती है ... यह दो गुणों के साथ किसी ऑब्जेक्ट की बजाय दो चर (प्रथम नाम और अंतिम नाम) बनाती है। भगवान जानता है कि newUser को क्या सौंपा गया है ... शायद उपयोगकर्ता ?? – user292701

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

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