একটি কী ছাড়া আমি কীভাবে একটি জাভাস্ক্রিপ্ট অবজেক্ট ক্লোন করতে পারি?


307

আমার একটি সমতল জেএস বস্তু রয়েছে:

{a: 1, b: 2, c: 3, ..., z:26}

আমি একটি উপাদান বাদে অবজেক্টটি ক্লোন করতে চাই:

{a: 1, c: 3, ..., z:26}

এটি করার সবচেয়ে সহজ উপায় কী (যদি সম্ভব হয় এস 6/7 ব্যবহার করতে পছন্দ করেন)?


মূল বস্তুর পরিবর্তন না করে: JSON.parse (JSON.stringify ({... obj, 'key2': অনির্ধারিত}))
infinity1975

উত্তর:


440

আপনি যদি ব্যাবেল ব্যবহার করেন তবে আপনি x থেকে ভেরিয়েবল বিতে সম্পত্তি বি অনুলিপি করতে নীচের বাক্য গঠন ব্যবহার করতে পারেন এবং তারপরে বাকী বৈশিষ্ট্যগুলিকে ভেরিয়েবল ওয়ায় অনুলিপি করতে পারেন :

let x = {a: 1, b: 2, c: 3, z:26};
let {b, ...y} = x;

এবং এটি স্থানান্তরিত হবে:

"use strict";

function _objectWithoutProperties(obj, keys) {
  var target = {};
  for (var i in obj) {
    if (keys.indexOf(i) >= 0) continue;
    if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
    target[i] = obj[i];
  }
  return target;
}

var x = { a: 1, b: 2, c: 3, z: 26 };
var b = x.b;

var y = _objectWithoutProperties(x, ["b"]);

58
আপনি যদি অব্যবহৃত ভেরিয়েবলগুলির জন্য আপনার কোডটি লিঙ্ক করেন তবে এর ফলে "অব্যবহৃত ভেরিয়েবল 'বি' হবে। সতর্কতা যদিও।
রস অ্যালেন

1
সিনট্যাক্সটি আপনার কীভাবে let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
দেখায়

14
@RossAllen ignoreRestSiblingsv3.15.0 (ফেব্রুয়ারি 3, 2017) এ যুক্ত একটি বিকল্প রয়েছে । দেখুন: কমিট c59a0ba
ইলিয়া

4
ইলিয়াপ্যালকিন যদিও এটি কিছুটা অলস বোধ করে কারণ এটি bসুযোগের সত্যতা যে পরিবর্তিত করে না ।
রস অ্যালেন

2
যদি আপনি মডিউল বিল্ড ব্যর্থ হয়ে থাকেন: সিনট্যাক্সেরর: অপ্রত্যাশিত টোকেন, আপনাকে সম্ভবত ব্যাবেল বিশ্রামের স্প্রেড ট্রান্সফর্ম প্লাগইন যুক্ত করতে হবে। Babeljs.io/docs/plugins/transfor-object-rest-spread
jsaven

133
var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;

বা যদি আপনি সম্পত্তি অপরিজ্ঞাত হিসাবে গ্রহণ করেন:

var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});

7
কেবল সম্পত্তি মুছে ফেলাটাই এটি করার একটি পরিষ্কার এবং সহজ উপায়।
sshow

24
মোছার সাথে সাবধানতা হ'ল এটি কোনও পরিবর্তনযোগ্য অপারেশন নয়।
জাভিদ জামে

1

1
তিনি তার উত্তর সম্পাদনা করার আগে এবং মুছে ফেলার বিবরণ যোগ করার আগে আমার মন্তব্য লেখা হয়েছিল
ফারিদ অ্যালামনোউটি

এটি হ'ল আমি যা খুঁজছিলাম ঠিক তেমনই কিছুটা ভিন্নতর পদ্ধতিতে প্রয়োগ করা হয়েছে: var কেক = {... কারেন্টকে, অনুরোধকারক: অনির্ধারিত};
অ্যাবেলিতো

73

ইলিয়া প্যালকিনের উত্তরে যুক্ত করতে: আপনি এমনকি কীগুলি গতিশীলভাবে মুছে ফেলতে পারেন:

const x = {a: 1, b: 2, c: 3, z:26};

const objectWithoutKey = (object, key) => {
  const {[key]: deletedKey, ...otherKeys} = object;
  return otherKeys;
}

console.log(objectWithoutKey(x, 'b')); // {a: 1, c: 3, z:26}
console.log(x); // {a: 1, b: 2, c: 3, z:26};

বাবেল আরপিএলে ডেমো

সূত্র:


3
এটি একটি দুর্দান্ত বাক্য গঠন।
হিনরিচ

2
এটি দুর্দান্ত, তবে অব্যবহৃত var মুছে যাওয়া কী এড়ানোর কোনও উপায় আছে? এটি কোনও সমস্যা সৃষ্টি করছে না এমন নয়, তবে জেএসহিন্টকে অভিযোগ করে তোলে এবং যেহেতু আমরা সত্যই এটি ব্যবহার করি না এটি অস্বাভাবিক বলে মনে হয়।
জনসন ওয়াং

6
@ জনসনওয়ং আপনি কীভাবে ব্যবহার _করতে চান না এমন ভেরিয়েবলের জন্য অনুমোদিত যা ব্যবহারের বিষয়ে?
রায়ান এইচ।

var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
জিমমন্ট

70

যারা ES6 ব্যবহার করতে পারবেন না তাদের জন্য আপনি lodashবা ব্যবহার করতে পারেন underscore

_.omit(x, 'b')

বা ramda

R.omit('b', x)

6
এখানে বাদ দেওয়া কি আরও যুক্তিযুক্ত হবে না ? _.omit(x, 'b')
টিবল্ট

ধন্যবাদ @tibalt। এটি দিয়ে উত্তর আপডেট করুন।
নোয়েল ল্লেভেরেস

মুছুন আরও সংক্ষিপ্ত - লোডাশ, আন্ডারস্কোর বা রামদা ব্যবহার কেবলমাত্র সেই প্রকল্পগুলির জন্য প্রাসঙ্গিক যা ইতিমধ্যে তাদের ব্যবহার এবং জেনে থাকে, অন্যথায় এটি 2018 এবং এর বাইরেও ক্রমহ্রাসমান।
জিমমন্ট

1
@ জিমমন্ট মুছা ইতিমধ্যে অন্যান্য উত্তরে উল্লেখ করা হয়েছে। সদৃশ জবাবের দরকার নেই, ভাবেনা? এবং অবশ্যই, এটি কেবল তাদের জন্য প্রাসঙ্গিক যারা ইতিমধ্যে লোডাশ বা রামদা ব্যবহার করেন। এবং এটি কেবল ES5 এর সাথে আটকে রয়েছে এবং এই উত্তরটিতে আগে বর্ণিত হিসাবে কেবল প্রাসঙ্গিক।
নোয়েল ল্লেভেরেস

@ ড্যাশমুগ আমার আগের মন্তব্যটি এই পদ্ধতির সমালোচনা (আপনার উত্তরের নয়) যা এই উত্তরে উপস্থাপিত পদ্ধতির ব্যবহার করার জন্য চয়ন করার সময় লক্ষ্য করা উচিত। আমি এই তথ্যটি চাই যদি আমি উত্তরগুলি পড়ছিলাম এবং আমার মন্তব্য যুক্ত করার এবং উল্লেখ করার কারণ হব delete
জিম্মন্ট

63

আমি এই ESNext একটি লাইনার ব্যবহার করি use

const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // remove b and c
console.log(clone)


আপনার যদি সাধারণ উদ্দেশ্যে কাজ করা প্রয়োজন:

function omit(obj, props) {
  props = props instanceof Array ? props : [props]
  return eval(`(({${props.join(',')}, ...o}) => o)(obj)`)
}

// usage
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = omit(obj, ['b', 'c'])
console.log(clone)


9
অ্যারে map(({b, c, ...others}) => ({...others}))(obj)
মোড়কের

@ বুকাবায়ে: উজ্জ্বল! এটিই লটের সেরা উত্তর! মান মেনে চলতে সক্ষম নোডে পুরোপুরি কাজ করে ইত্যাদি আপনার উত্তর হিসাবে জমা দেওয়া উচিত submit
ডেভিড.পিএফএফএক্স

3
চমত্কার উত্তর সাথী .. <3
অজিথকুমার এস

5
@ টোটাইমেডলি: আমার দ্বারা নয় আমি পাঠযোগ্যতার কারণে যেকোন সময় যাদুর কার্যক্রমে স্ট্যান্ডার্ড ES6 এর অংশটি সিনট্যাকটিক ফর্মটি গ্রহণ করব।
david.pfx

1
উজ্জ্বল। এখানেই শেষ.
darksoulsong

22

আপনি এটির জন্য একটি সাধারণ সহায়ক ফাংশন লিখতে পারেন। লোড্যাশের একই নামের সাথে একই রকম ফাংশন রয়েছে: বাদ দিন

function omit(obj, omitKey) {
  return Object.keys(obj).reduce((result, key) => {
    if(key !== omitKey) {
       result[key] = obj[key];
    }
    return result;
  }, {});
}

omit({a: 1, b: 2, c: 3}, 'c')  // {a: 1, b: 2}

এছাড়াও, লক্ষ্য করুন যে এটি অবজেক্ট.স্যাসাইন এর চেয়ে দ্রুত এবং তারপরে মুছুন: http://jsperf.com/omit-key


11

এরকম কিছু হতে পারে:

var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;

এটি কি যথেষ্ট? বা cআসলে কপি করা যায় না?


11

অবজেক্ট ডেস্ট্রাকচারিং ব্যবহার করে

const omit = (prop, { [prop]: _, ...rest }) => rest;
const obj = { a: 1, b: 2, c: 3 };
const objWithoutA = omit('a', obj);
console.log(objWithoutA); // {b: 2, c: 3}


দুর্দান্ত সমাধান!
মিখলেঙ্কো

2
আমার ধারণা এই সমাধানটি জেএসলিন্টে 'অব্যবহৃত ভেরিয়েবল' সতর্কতা রোধ করতে বোঝানো হয়েছে। দুর্ভাগ্যক্রমে, _ব্যবহারটি ইএসলিন্টের জন্য সমস্যাটির সমাধান করে না ...
বার্ট ব্রুইনোগে

6

আরে মনে হচ্ছে আপনি যখন কোনও বস্তু অনুলিপি করার চেষ্টা করছেন তখন কোনও সম্পত্তি মুছে ফেলার জন্য আপনি রেফারেন্স ইস্যুগুলিতে চলেছেন। কোথাও আপনাকে আদিম পরিবর্তনশীল নির্ধারণ করতে হবে যাতে জাভাস্ক্রিপ্ট একটি নতুন মান তৈরি করে।

সাধারণ ট্রিক (ভয়াবহ হতে পারে) আমি এটি ব্যবহার করেছি

var obj = {"key1":"value1","key2":"value2","key3":"value3"};

// assign it as a new variable for javascript to cache
var copy = JSON.stringify(obj);
// reconstitute as an object
copy = JSON.parse(copy);
// now you can safely run delete on the copy with completely new values
delete copy.key2

console.log(obj)
// output: {key1: "value1", key2: "value2", key3: "value3"}
console.log(copy)
// output: {key1: "value1", key3: "value3"}

আমি আসলে এটি পছন্দ করি। করতে পারে JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));। এমনকি এটি মুছতে হবে না, কেবল একটি মিথ্যা মান দরকার।
চাদ

6

গতিশীল কীগুলি বাদ দেওয়ার জন্য এখানে একটি বিকল্প রয়েছে যা আমি বিশ্বাস করি যে এখনও উল্লেখ করা হয়নি:

const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;

const { [removeMe]: removedKey, ...newObj } = obj;

removeMeহিসাবে উপহিত removedKeyএবং উপেক্ষা করা হয়। newObjহয়ে { 2: 2, 3: 3, 4: 4 }। নোট করুন যে মুছে ফেলা কীটি বিদ্যমান নেই, মানটি সেট করা হয়নি undefined


সুন্দর সমাধান। আমার অনুরূপ ব্যবহারের কেস ছিল (রিডুসারে ডায়নামিক কী)।
এরিকজিও


3

লোদাশ বাদ দিন

let source = //{a: 1, b: 2, c: 3, ..., z:26}
let copySansProperty = _.omit(source, 'b');
// {a: 1, c: 3, ..., z:26}

হ্যাঁ, লোডাশ একটি মার্জিত বিকল্প, তবে আমি ভ্যানিলা
ইএস 6

3

এটি করার জন্য আপনি স্প্রেড অপারেটরও ব্যবহার করতে পারেন

const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }

2
সুপার নিফটি মনে হচ্ছে। এটি তবে কীটিকে copy
অপরিজ্ঞাত

সুতরাং সেখানে কেবলমাত্র যদি থাকে তবে আপনি অপরিবর্তিত কীগুলি সরিয়ে ফেলতে পারেন
ভিক্টর

1
আপনি কেন অনুলিপিটিতে অতিরিক্ত ছড়িয়ে const copy = { ...source, b: undefined } পড়েছেন তা নিশ্চিত নন, ঠিক একইভাবে ফোটে।
বার্ট ব্রুইনোগে

3

কাঠামোগত ব্যবহারের উপরের সমাধানগুলি আপনার ব্যবহারযোগ্য ভেরিয়েবলের সত্যতা থেকে ভোগে, যা যদি আপনি এটি ব্যবহার করে থাকেন তবে ইএসলিন্টের কাছ থেকে অভিযোগ আসতে পারে।

সুতরাং এখানে আমার সমাধান:

const src = { a: 1, b: 2 }
const result = Object.keys(src)
  .reduce((acc, k) => k === 'b' ? acc : { ...acc, [k]: src[k] }, {})

বেশিরভাগ প্ল্যাটফর্মগুলিতে (বাবেল ব্যবহার না করে IE ব্যতীত) আপনিও এটি করতে পারেন:

const src = { a: 1, b: 2 }
const result = Object.fromEntries(
  Object.entries(src).filter(k => k !== 'b'))


2

যদি আপনি একটি বিশাল ভেরিয়েবলের সাথে কাজ করে থাকেন তবে আপনি এটি অনুলিপি করতে চান না এবং এটি মুছে ফেলতে চান না কারণ এটি অদক্ষ হবে।

একটি হ'লনপ্রপার্টি চেক সহ একটি সাধারণ ফর্ম-লুপটি কাজ করা উচিত এবং এটি ভবিষ্যতের প্রয়োজনের সাথে আরও বেশি খাপ খাইয়ে নিতে পারে:

for(var key in someObject) {
        if(someObject.hasOwnProperty(key) && key != 'undesiredkey') {
                copyOfObject[key] = someObject[key];
        }
}

1
স্প্রেড অপারেটর সলিউশন দূরের ভাল সিনট্যাক্সের সাথে ঠিক একই কাজ করে।
ডেভিড.পিএফএফএক্স

2

এই সম্পর্কে কি? আমি এই প্যাটারটিকে আশেপাশে কখনও পাইনি তবে আমি অতিরিক্ত বস্তু তৈরির প্রয়োজন ছাড়াই এক বা একাধিক বৈশিষ্ট্য বাদ দেওয়ার চেষ্টা করছিলাম। এটি কাজটি করার মতো বলে মনে হচ্ছে তবে কিছু পার্শ্ব প্রতিক্রিয়া রয়েছে যা আমি দেখতে পাচ্ছি না। অবশ্যই খুব পঠনযোগ্য নয়।

const postData = {
   token: 'secret-token',
   publicKey: 'public is safe',
   somethingElse: true,
};

const a = {
   ...(({token, ...rest} = postData) => (rest))(),
}

/**
a: {
   publicKey: 'public is safe',
   somethingElse: true,
}
*/

2

আমি আমার রেডাক্স রিডিসারের উদাহরণ হিসাবে এটি এভাবে সম্পাদন করেছি:

 const clone = { ...state };
 delete clone[action.id];
 return clone;

অন্য কথায়:

const clone = { ...originalObject } // note: original object is not altered
delete clone[unwantedKey]           // or use clone.unwantedKey or any other applicable syntax
return clone                        // the original object without the unwanted key

3 বছর আগে গৃহীত উত্তরের তুলনায় (এবং উভয় বিকল্প অনেক ব্রাউজারে স্থানান্তরিত করার উপর নির্ভর করে) তুলনায় অনেক অতিরিক্ত কাজের মতো মনে হয়।
carpiediem

আমার অনুরূপ ব্যবহারের কেস রয়েছে (রিডিউসার) তাই আমি এমন একটি দুর্দান্ত উপায় নিয়ে এসেছি যা কোনও পরিবর্তন ছাড়াই গতিশীল কীগুলি সমর্থন করে। মূলত: const { [removeMe]: removedKey, ...newObj } = obj;- এই প্রশ্নের আমার উত্তর দেখুন।
গোল্ডিনস

1

আমি সম্প্রতি এটি খুব সহজ উপায়ে করেছি:

const obj = {a: 1, b: 2, ..., z:26};

অযাচিত সম্পত্তি আলাদা করতে কেবল স্প্রেড অপারেটর ব্যবহার করুন :

const {b, ...rest} = obj;

... এবং অবজেক্ট.অ্যাসাইন করুন কেবলমাত্র 'বিশ্রাম' অংশ নিতে:

const newObj = Object.assign({}, {...rest});

3
restইতিমধ্যে একটি নতুন অবজেক্ট - আপনার শেষ লাইনের দরকার নেই। এছাড়াও, এটি গৃহীত সমাধানের মতো ident
carpiediem

0
const x = {obj1: 1, pass: 2, obj2: 3, obj3:26};

const objectWithoutKey = (object, key) => {
  const {[key]: deletedKey, ...otherKeys} = object;
  return otherKeys;
}

console.log(objectWithoutKey(x, 'pass'));

1
যদিও এই কোডটি প্রশ্নের সমাধান দিতে পারে, কেন / কীভাবে এটি কাজ করে তা প্রসঙ্গে যুক্ত করা ভাল। এটি ভবিষ্যতের ব্যবহারকারীদের শিখতে এবং তাদের নিজস্ব কোডটিতে এই জ্ঞানটি প্রয়োগ করতে সহায়তা করতে পারে। কোডটি ব্যাখ্যা করা হলে আপনিও upvotes আকারে ব্যবহারকারীদের কাছ থেকে ইতিবাচক প্রতিক্রিয়া জানাতে পারেন।
borchvm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.