मेरे पास एक सपाट जेएस वस्तु है:
{a: 1, b: 2, c: 3, ..., z:26}
मैं एक तत्व को छोड़कर ऑब्जेक्ट को क्लोन करना चाहता हूं:
{a: 1, c: 3, ..., z:26}
ऐसा करने का सबसे आसान तरीका क्या है (यदि संभव हो तो es6 / 7 का उपयोग करना पसंद करते हैं)?
मेरे पास एक सपाट जेएस वस्तु है:
{a: 1, b: 2, c: 3, ..., z:26}
मैं एक तत्व को छोड़कर ऑब्जेक्ट को क्लोन करना चाहता हूं:
{a: 1, c: 3, ..., z:26}
ऐसा करने का सबसे आसान तरीका क्या है (यदि संभव हो तो es6 / 7 का उपयोग करना पसंद करते हैं)?
जवाबों:
यदि आप Babel का उपयोग करते हैं तो आप x से गुणक b को चर b में कॉपी करने के लिए निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं और फिर बाकी गुणों को चर y में कॉपी कर सकते हैं :
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"]);
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
जिसे v3.15.0 (3 फरवरी, 2017) में जोड़ा गया था। देखें: प्रतिबद्ध c59a0ba
b
गुंजाइश है।
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});
इल्या पालकिन के जवाब में जोड़ने के लिए: आप गतिशील रूप से चाबियाँ निकाल सकते हैं:
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};
स्रोत:
_
जिसके बारे में एक चर के लिए अनुमति दी जाती है जिसे आप उपयोग करने का इरादा नहीं रखते हैं?
var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
जो लोग ES6 का उपयोग नहीं कर सकते हैं, उनके लिए आप उपयोग कर सकते हैं lodash
या कर सकते हैं underscore
।
_.omit(x, 'b')
या ramda
।
R.omit('b', x)
delete
।
मैं इस ESNext एक लाइनर का उपयोग करें
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)
map
आप कर सकते हैं:(({b, c, ...others}) => ({...others}))(obj)
आप इसके लिए एक सरल सहायक कार्य लिख सकते हैं। Lodash एक ही नाम के साथ एक समान कार्य है: न आना
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}
इसके अलावा, ध्यान दें कि यह Object.assign से तेज है और तब हटाएं: http://jsperf.com/omit-key
शायद कुछ इस तरह:
var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;
क्या यह काफी अच्छा है? या c
वास्तव में नकल नहीं हो सकती?
ऑब्जेक्ट डिस्ट्रक्टिंग का उपयोग करना
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}
_
ESLint के लिए इस मुद्दे को हल नहीं करता है ...
जब आप किसी ऑब्जेक्ट को कॉपी करने का प्रयास कर रहे हों, तो किसी प्रॉपर्टी को हटाने की कोशिश करने पर हेरा फेरी लगती है। कहीं न कहीं आपको आदिम वेरिएबल्स को असाइन करना होता है इसलिए जावास्क्रिप्ट एक नया मूल्य बनाता है।
सरल चाल (भयावह हो सकती है) मैंने इसका इस्तेमाल किया था
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 })));
। इसे हटाना भी नहीं है, बस एक मिथ्या मूल्य चाहिए।
डायनामिक कुंजियों को छोड़ने का एक विकल्प यह है कि मेरा मानना है कि अभी तक इसका उल्लेख नहीं किया गया है:
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
।
सबसे आसान तरीका
const allAlphabets = {a: 1, b: 2, c: 3, ..., z:26};
const { b, ...allExceptOne } = allAlphabets;
console.log(allExceptOne); // {a: 1, c: 3, ..., z:26}
Lodash न आना
let source = //{a: 1, b: 2, c: 3, ..., z:26}
let copySansProperty = _.omit(source, 'b');
// {a: 1, c: 3, ..., z:26}
आप ऐसा करने के लिए प्रसार ऑपरेटर का उपयोग भी कर सकते हैं
const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }
copy
const copy = { ...source, b: undefined }
ठीक उसी तरह से उबलता है।
संरचना का उपयोग करने के ऊपर दिए गए समाधान इस तथ्य से ग्रस्त हैं कि आपके पास एक उपयोग किया गया चर है, जो ईएसएलआईएन से शिकायत का कारण बन सकता है यदि आप इसका उपयोग कर रहे हैं।
तो यहाँ मेरे समाधान हैं:
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'))
इस बारे में कैसा है:
let clone = Object.assign({}, value);
delete clone.unwantedKey;
यदि आप एक विशाल चर के साथ काम कर रहे हैं, तो आप इसे कॉपी नहीं करना चाहते हैं और फिर इसे हटा सकते हैं, क्योंकि यह अक्षम होगा।
एक hasOwnProperty चेक के साथ एक साधारण लूप काम करना चाहिए, और यह भविष्य की जरूरतों के लिए अधिक अनुकूल है:
for(var key in someObject) {
if(someObject.hasOwnProperty(key) && key != 'undesiredkey') {
copyOfObject[key] = someObject[key];
}
}
इस बारे में क्या? मुझे यह संरक्षक कभी नहीं मिला लेकिन मैं अतिरिक्त वस्तु बनाने की आवश्यकता के बिना एक या एक से अधिक संपत्तियों को बाहर करने की कोशिश कर रहा था। यह काम करने के लिए लगता है, लेकिन कुछ दुष्प्रभाव हैं जो मैं नहीं देख पा रहा हूं। यकीन के लिए बहुत पठनीय नहीं है।
const postData = {
token: 'secret-token',
publicKey: 'public is safe',
somethingElse: true,
};
const a = {
...(({token, ...rest} = postData) => (rest))(),
}
/**
a: {
publicKey: 'public is safe',
somethingElse: true,
}
*/
मैंने इसे इस तरह से पूरा किया, मेरे Redux reducer के उदाहरण के रूप में:
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
const { [removeMe]: removedKey, ...newObj } = obj;
- इस सवाल पर मेरा जवाब देखें।
मैंने हाल ही में इसे बहुत सरल तरीके से किया है:
const obj = {a: 1, b: 2, ..., z:26};
सिर्फ अवांछित संपत्ति को अलग करने के लिए प्रसार ऑपरेटर का उपयोग करना:
const {b, ...rest} = obj;
... और ऑब्जेक्ट। केवल 'शेष' भाग लेने के लिए असाइन करें:
const newObj = Object.assign({}, {...rest});
rest
पहले से ही एक नई वस्तु है- आपको अंतिम पंक्ति की आवश्यकता नहीं है। साथ ही, यह स्वीकृत समाधान के समान है।
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'));