ইএস 6 এ অবজেক্ট থেকে কিছু সম্পত্তি নিতে ওয়ান-লাইনার


153

কীভাবে কেউ এমন কোনও ফাংশন লিখতে পারেন, যা ES6- এ সর্বাধিক কমপ্যাক্ট উপায়ে কেবল কয়েকটি অ্যাট্রিবিউট লাগে?

আমি ডেস্ট্রাকচারিং + সরলিকৃত অবজেক্ট আক্ষরিক ব্যবহার করে সমাধান নিয়ে এসেছি, তবে ক্ষেত্রগুলির তালিকাটি কোডটিতে পুনরাবৃত্তি করা পছন্দ করি না।

এমনকি একটি পাতলা সমাধান আছে?

(v) => {
    let { id, title } = v;
    return { id, title };
}

উত্তর:


124

এখানে কিছু স্লিমার, যদিও এটি ক্ষেত্রগুলির তালিকার পুনরাবৃত্তি এড়ানো যায় না। প্যারামিটারের প্রয়োজনীয়তা এড়াতে এটি "প্যারামিটার ডেস্ট্রাকচারিং" ব্যবহার করে v

({id, title}) => ({id, title})

(এই অন্যান্য উত্তরে একটি চলমান উদাহরণ দেখুন )।

@ ইথানব্রাউন এর সমাধান আরও সাধারণ। এখানে এটির আরও একটি আইডোমেটিক সংস্করণ রয়েছে যা ব্যবহার করে Object.assignএবং গণনা করা বৈশিষ্ট্য ( [p]অংশ):

function pick(o, ...props) {
    return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}

যদি আমরা বৈশিষ্ট্যগুলির বৈশিষ্ট্যগুলি যেমন configurableগেটর এবং সেটটারগুলি সংরক্ষণ করতে চাই এবং অ-গণনাযোগ্য বৈশিষ্ট্যগুলি বাদ দিই, তবে:

function pick(o, ...props) {
    var has = p => o.propertyIsEnumerable(p),
        get = p => Object.getOwnPropertyDescriptor(o, p);

    return Object.defineProperties({},
        Object.assign({}, ...props
            .filter(prop => has(prop))
            .map(prop => ({prop: get(props)})))
    );
}

10
+1 দুর্দান্ত উত্তর, টোরাজাবুরো; আমাকে সচেতন করার জন্য ধন্যবাদ Object.assign; এস একটি ক্রিসমাস ট্রি এর মত অনেকগুলি উপহার সহ আমি এখনও ছুটির কয়েক মাস পরে উপহারগুলি খুঁজে পাচ্ছি
ইথান ব্রাউন

একটি ত্রুটি পেয়েছে: সম্পত্তি বর্ণনা অবশ্যই একটি অবজেক্ট: অপরিজ্ঞাত। এটা করা উচিত নয় filter(...).map(prop => ({[prop]: get(prop)})))?
অন্তহীন

আপনার প্রথম pick()প্রয়োগের জন্য আপনি এমন কিছু করতেও পেরেছিলেনreturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
প্যাট্রিক রবার্টস

দুর্ভাগ্যক্রমে পিকের সংস্করণ প্রবাহ বা টাইপ স্ক্রিপ্টে টাইপ নিরাপদ হবে না। আপনি যদি সুরক্ষা টাইপ করতে চান তবে মূল অবজেক্টের ডিস্ট্রাকচার অ্যাসাইনমেন্টের কোনও উপায় নেই, তারপরে প্রতিটিকে একটি নতুন অবজেক্টে অর্পণ করুন।
duhseekoh

যখন কোনও জিনিসে কোনও সম্পত্তি বিদ্যমান না থাকে, আপনি পান undefined। কখনও কখনও এটি গুরুত্বপূর্ণ। তা ছাড়াও, দুর্দান্ত ধারণা।
এক্স-ইউরি

43

আমি সেখানে এটা আরো অনেক কিছু আপনার উত্তর (অথবা torazburo এর) চেয়ে কম্প্যাক্ট করতে কোন ভাবেই মনে করি না, কিন্তু মূলত আপনি কি করতে চেষ্টা করছেন অনুকরণ হয় আন্ডারস্কোর এর pickঅপারেশন । এটি ES6 এ পুনরায় বাস্তবায়ন করা যথেষ্ট সহজ হবে:

function pick(o, ...fields) {
    return fields.reduce((a, x) => {
        if(o.hasOwnProperty(x)) a[x] = o[x];
        return a;
    }, {});
}

তারপরে আপনার একটি কার্যকর পুনরায় ব্যবহারযোগ্য ফাংশন রয়েছে:

var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');

ধন্যবাদ। এটি আমার প্রশ্নের উত্তর নয়, তবে খুব সুন্দর সংযোজন।
কিরিলয়েড

7
(অসহায়তা) এটা পছন্দ আমার মনে হয় আপনার সমাধান জন্য একটি উত্তর; কোনও পাতলা সাধারণ সমাধান নেই (টোরাজাবুরোর সমাধান অতিরিক্ত ভার্চিয়া থেকে সরিয়ে দেয়, তবে প্রয়োজনীয় সমস্যা - সমস্ত সম্পত্তির নাম দু'বার লিখতে হবে - এর অর্থ এটি আপনার সমাধানের চেয়ে ভাল কোনও স্কেল করে না)। আমার সমাধানটি কমপক্ষে ভাল স্কেল করে ... pickএকবার ফাংশনটি ঠিক করে নিন এবং আপনি যতগুলি সম্পত্তি চান তা চয়ন করতে পারেন এবং এটি তাদের দ্বিগুণ করবে না।
ইথান ব্রাউন

1
আপনি কেন ব্যবহার করবেন hasOwnProperty? ক্ষেত্রগুলি যদি হাতে নির্বাচিত হয়, এমনকি inএটি আরও উপযুক্ত বলে মনে হয়; যদিও আমি চেকটি পুরোপুরি বাদ দিতে যাব এবং কেবল তাদের ডিফল্ট করতে দেব undefined
বার্গি

বার্গি, এটি একটি যুক্তিসঙ্গত পয়েন্ট ... আমি কেবলমাত্র একটি প্রোটোটাইপ চেইনের বৈশিষ্ট্যগুলি (পদ্ধতিগুলি নয়) অদ্ভুত এবং "গন্ধযুক্ত" হিসাবে বিবেচনা করি (যেমন এটি কোনও কোড গন্ধ), এবং আমি সেগুলি ডিফল্টরূপে ফিল্টার করতে পছন্দ করি। যদি এমন কোনও অ্যাপ্লিকেশন থাকে যার প্রোটোটাইপ বৈশিষ্ট্য প্রয়োজন, ভাল ... তার জন্য একটি বিকল্প থাকতে পারে।
ইথান ব্রাউন

জসন অ্যারে সম্পর্কে কি!
রিজওয়ান প্যাটেল

19

ওয়ান-লাইনার হিসাবে এটি সমাধানের কৌশলটি গৃহীত পদ্ধতির ফ্লিপ করা: মূল বস্তু থেকে শুরু করার পরিবর্তে orig , যে কীগুলি তারা বের করতে চান তা থেকে শুরু করতে পারেন।

একটি ব্যবহার করে Array#reduceপ্রতিটি প্রয়োজনীয় কী খালি বস্তুতে সংরক্ষণ করতে পারে যা হিসাবে পাস করা হয়initialValue ফাংশন for

তাই ভালো:

const orig = {
  id: 123456789,
  name: 'test',
  description: '…',
  url: 'https://…',
};

const filtered = ['id', 'name'].reduce((result, key) => { result[key] = orig[key]; return result; }, {});

console.log(filtered); // Object {id: 123456789, name: "test"}


11

কমা অপারেটরটি ব্যবহার করে একটি ছোট্ট বিট সংক্ষিপ্ত সমাধান:

const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})

console.log(
  pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
)  


এটি কিভাবে ব্যবহার করবেন? আপনি একটি উদাহরণ প্রদান করতে পারেন?
টমাস এম

1
এটি pickএই থ্রেডের অন্যান্য ফাংশনের মতোই কাজ করে :pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
শেসেক

8

টিসি 39 এর অবজেক্ট রেস্ট / স্প্রেড প্রোপার্টি প্রোপোজালটি এটিকে সুন্দর করে তুলবে:

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

(এতে আপনার পরিবর্তনশীল xএবং yভেরিয়েবলগুলি তৈরির নেতিবাচক প্রভাব থাকতে পারে))


33
এটি একটি সুবিধাজনক ফর্ম omit, তবে নয়pick
কিরিলয়েড

5
ইএস প্রস্তাব হিসাবে এর ঠিক বিপরীত কাজ করে এমন একটি রূপটি দেখতে আমি পছন্দ করতে চাই:let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
গফুল্লাম

3

আপনি বিদ্যমান অবজেক্ট থেকে বৈশিষ্ট্যগুলি আনপ্যাক করতে অবজেক্ট ডেস্ট্রাকচারিং ব্যবহার করতে পারেন এবং বিভিন্ন নামে ভেরিয়েবলগুলিতে তাদের বরাদ্দ করতে পারেন - নতুন, প্রাথমিকভাবে খালি অবজেক্টের ক্ষেত্র।

const person = {
  fname: 'tom',
  lname: 'jerry',
  aage: 100,
}

let newPerson = {};

({fname: newPerson.fname, lname: newPerson.lname} = person);

console.log(newPerson);


(সূচক): 36 আনকাচড সিনট্যাক্স এরির: অবৈধ ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট টার্গেট
রিমিজ

@ রেমেজেস জানেন না আপনি কোথায় এবং কীভাবে এটি সম্পাদন করছেন তবে এটি এসও কোড সম্পাদক এবং ক্রোম বিকাশকারী সরঞ্জামগুলিতে ভালভাবে কাজ করে।
দক্ষাম

আমি jsfiddle ব্যবহার করেছি
রিমিজ

আমি আপনার উত্তরটি কিছুটা উন্নত করেছি, তবে এটি এখনও ভার্চুয়াল, বনাম, ওপি যা চেয়েছিল। এটি কেবল ক্ষেত্রের নামগুলিই নয়, নতুন বস্তুর নামও পুনরাবৃত্তি করে।
ড্যান ড্যাসক্লেস্কু

3

প্রশ্নটি লেখার সময় ES6 সর্বশেষতম বৈশিষ্ট ছিল। এই উত্তরে বর্ণিত হিসাবে , কী বাছাই ইএস 6 এর তুলনায় ES2019 এ উল্লেখযোগ্যভাবে খাটো:

Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => ['foo', 'bar'].includes(key))
)

2

জাভাস্ক্রিপ্টের অবজেক্ট শর্টহ্যান্ড সিনট্যাক্সের উন্নতি করার জন্য বর্তমানে একটি স্ট্রোম্যান প্রস্তাব রয়েছে , যা পুনরাবৃত্তি ছাড়াই নামকরণ করা সম্পত্তিগুলিকে "বাছাই" সক্ষম করবে:

const source = {id: "68646", genre: "crime", title: "Scarface"};
const target = {};
Object.assign(target, {source.title, source.id});

console.log(picked);
// {id: "68646", title: "Scarface"}

দুর্ভাগ্যক্রমে, প্রস্তাবটি শীঘ্রই যে কোনও সময় কোথাও চলেছে বলে মনে হয় না। জুলাই 2017 এ শেষবার সম্পাদিত হয়েছে এবং এখনও পর্যায় 0 তে একটি খসড়া , এটির পরামর্শ দিয়েছিলেন যে লেখক এ সম্পর্কে বিভ্রান্ত বা ভুলে যেতে পারেন।

ES5 এবং তার আগের (অ-কঠোর মোড)

সংক্ষিপ্ততম শর্টহ্যান্ডের মধ্যে আমি ভাবতে পারি একটি প্রাচীন ভাষার বৈশিষ্ট্য জড়িত যা কেউ আর ব্যবহার করে না:

Object.assign(target, {...(o => {
    with(o) return { id, title };
})(source)});

withস্টেটমেন্টগুলিকে কঠোর মোডে নিষিদ্ধ করা হয়েছে, আধুনিক জাভাস্ক্রিপ্টের 99.999% এর জন্য এই পদ্ধতির অকেজো করা হয়েছে। কিছুটা লজ্জার বিষয়, কারণ এটি withবৈশিষ্ট্যের জন্য আমি খুঁজে পেয়েছি এটি কেবলমাত্র অর্ধ-শালীন ব্যবহার । 😀


1

আমার কাছে ইথান ব্রাউন এর সমাধানের মতো, তবে আরও ছোট - pickফাংশন রয়েছে। অন্য ফাংশনটি pick2কিছুটা দীর্ঘ (এবং ধীর), তবে ES6 পদ্ধতিতে বৈশিষ্ট্যগুলির নাম পরিবর্তন করতে দেয়।

const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {})

const pick2 = (o, ...props) => props.reduce((r, expr) => {
  const [p, np] = expr.split(":").map( e => e.trim() )
  return p in o ? {...r, [np || p]: o[p]} : r
}, {}) 

ব্যবহারের উদাহরণ এখানে:

const d = { a: "1", c: "2" }

console.log(pick(d, "a", "b", "c"))        // -> { a: "1", c: "2" }
console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" }

1
ডাউনভোটের কারণ কী? এটি আপনার জন্য কাজ করে না?
আলেকজান্ডার প্রিয়জেভ

0

আমার এই একাকীকরণের প্রয়োজন ছিল তবে প্রস্তাবিত কীগুলি পাওয়া যায় কিনা তা আমি জানতাম না। সুতরাং, আমি @ ট্যারাজাবুরো উত্তর নিয়েছি এবং আমার ব্যবহারের ক্ষেত্রে উন্নতি করেছি:

function pick(o, ...props) {
  return Object.assign({}, ...props.map(prop => {
    if (o[prop]) return {[prop]: o[prop]};
  }));
}

// Example:
var person = { name: 'John', age: 29 };
var myObj = pick(person, 'name', 'sex'); // { name: 'John' }

0

https://stackoverflow.com/users/865693/shesek এর হ্রাস পদ্ধতির দ্বারা অনুপ্রাণিত :

const pick = (orig, ...keys) => keys.reduce((acc, key) => ({...acc, [key]: orig[key]}), {})

ব্যবহার:

pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear') ফলাফল স্বরূপ: {model: "F40", productionYear: 1987}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.