কীভাবে জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যের একটি উপসেট পাবেন


424

বলুন আমার একটি বিষয় আছে:

elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};

আমি এর বৈশিষ্ট্যগুলির একটি উপসেট সহ একটি নতুন অবজেক্ট তৈরি করতে চাই।

 // pseudo code
 subset = elmo.slice('color', 'height')

 //=> { color: 'red', height: 'unknown' }

আমি কীভাবে এটি অর্জন করতে পারি?


2
ইন্ডসকোর লাইব্রেরিতে এর মতো অনেক সহায়ক ফাংশন রয়েছে, এটি পরীক্ষা করে দেখুন: আন্ডারসোর্জস.আর। / পিক
স্টিফান

4
আমি ভেবেছিলাম emo.sliceপ্রথম নজরে বলেছি ।
বিল ক্রিসওয়েল

1
দ্বিতীয় ভাবার বিষয়ে ... আমি কোনও উপসেট তৈরি করব না ...
অ্যান্ড্রু

উত্তর:


673

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

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);

console.log(picked); // { a: 5, c: 7 }


ফিলিপ কেভিচ থেকে:

এটি তাত্ক্ষণিকভাবে বলা হচ্ছে কেবল একটি বেনাম ফাংশন। এর সবগুলি এমডিএন- এর ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট পৃষ্ঠাতে পাওয়া যাবে । এখানে একটি প্রসারিত ফর্ম

let unwrap = ({a, c}) => ({a, c});

let unwrap2 = function({a, c}) { return { a, c }; };

let picked = unwrap({ a: 5, b: 6, c: 7 });

let picked2 = unwrap2({a: 5, b: 6, c: 7})

console.log(picked)
console.log(picked2)


37
এটি কীভাবে করবেন তা আপনি কীভাবে শিখলেন? আমি দেখেছি এমন কোনও দস্তাবেজ বা নিবন্ধের কোথাও (এমডিএন সহ) এটি বস্তু বিন্যাসে তীর সিনট্যাক্সটি ব্যবহৃত হচ্ছে তা দেখায় না। এটি জানতে পেরে খুব সুন্দর।
পাপিরো

52
এটি তাত্ক্ষণিকভাবে বলা হচ্ছে কেবল একটি বেনাম ফাংশন। এর সবগুলি এমডিএন-এর ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট পৃষ্ঠাতে পাওয়া যাবে। এখানে একটি প্রসারিত ফর্মটি রয়েছে: let unwrap = ({a, c}) => ({a, c}); let unwrap2 = function({a, c}) { return { a, c }; }; let picked = unwrap({ a: 5, b: 6, c: 7 });
ফিলিপ কেভিচ 27'17

8
স্প্রেড অপারেটরের সাথে এটি গতিশীল করার কোনও উপায় আছে?
টম সার্ডু

4
@TomSarduy আপনি বাকি ব্যবহার করতে পারে যদি আপনি যা মুছে ফেলার জন্য সাজসরঞ্জাম নির্দিষ্ট করতে চান, যেমন const { b, ...picked } = objectতৈরি করবে pickedযেমন { a: 5, c: 7 }। আপনি খ সরানোর জন্য কেবল নির্দিষ্ট করেছেন। যদিও আপনি ব্যবহার করছেন না এমন কোনও ভ্যারিয়াল ঘোষণার জন্য আপনার এসলিন্ট সম্ভবত আপনাকে বিরক্ত করবে।
জোশি

24
এখানে একটি অসুবিধা হ'ল আপনাকে দু'বার অ্যাট্রিবিউট নামের সিরিজটি পুরোপুরি টাইপ করতে হবে। এটি এমন একটি ক্ষেত্রে বেশ কয়েকটি সমস্যা হতে পারে যেখানে অনেকগুলি গুণাবলী বাছাই করা দরকার।
গেরশম

144

আমি লোডাশকে একবার দেখার পরামর্শ দিই ; এটির অনেক দুর্দান্ত ইউটিলিটি ফাংশন রয়েছে।

উদাহরণস্বরূপ pick()আপনি যা চান ঠিক তা হবে:

var subset = _.pick(elmo, ['color', 'height']);

বেহালা


2
আন্ডারস্কোর.জেএস এর জন্য একই
ড্যান

1
নির্বাচনের পরিবর্তে কেবলমাত্র নির্দিষ্ট ক্ষেত্রগুলি বাদ দেওয়ার কোনও ফাংশন রয়েছে? সুতরাং আমার জসনে আমার প্রায় 50 টি ক্ষেত্র রয়েছে এবং কেবল 2 টি ক্ষেত্র ব্যতীত সমস্ত কিছুই চাই।
শ্রীকান্ত প্রভু

7
হাঁ! আপনি _.omit(elmo, ['voice'])সবকিছু ফিরিয়ে দিতে ব্যবহার করতে পারেন তবেvoice
xavdid

এই পদ্ধতির বিষয়ে আমি যা পছন্দ করি না তা হ'ল আপনি ক্ষেত্রের নামগুলি উদ্ধৃতিতে রেখেছেন যাতে এটি টাইপগুলির পক্ষে সংবেদনশীল, আপনার আইডিতে কোনও সম্পত্তি নাম পরিবর্তন করার মতো সাধারণ রিফ্যাক্টরিংগুলি এটি বাছাই করে না, ইত্যাদি c
অ্যান্ডি

117

আপনি যদি ES6 ব্যবহার করে থাকেন তবে ডেস্ট্রাকচারিং ব্যবহার করে এটি করার একটি খুব সংক্ষিপ্ত উপায় রয়েছে। তৈরির ফলে আপনি কোনও স্প্রেড ব্যবহার করে অবজেক্টগুলিতে সহজেই যুক্ত হতে দেয় তবে এটি আপনাকে একই উপায়ে সাবসেট অবজেক্ট তৈরি করতে দেয়।

const object = {
  a: 'a',
  b: 'b',
  c: 'c',
  d: 'd',
}

// Remove "c" and "d" fields from original object:
const {c, d, ...partialObject} = object;
const subset = {c, d};

console.log(partialObject) // => { a: 'a', b: 'b'}
console.log(subset) // => { c: 'c', d: 'd'};

6
এটি কেবল কোনও ক্ষেত্র অপসারণ করতে কাজ করে, একটি পরিচিত উপসেটটি নির্বাচন করার জন্য নয়? সম্ভাব্যভাবে অপরিণত ক্ষেত্রগুলি অপসারণের এক বিশাল সংখ্যা, তবে এটি কিছু লোক যা খুঁজছে তা হতে পারে
আলেকজান্ডার মিলস

সত্য, তবে এটি বেশ কয়েকটি পরিচিত ক্ষেত্রগুলি সরিয়ে ফেলতে পারে যা একটি নতুন অবজেক্টে পুনর্নির্দিষ্ট করা যেতে পারে তাই এটি এখনও এই প্রশ্নের সাথে প্রাসঙ্গিক বোধ করে। উত্তরটি আরও চিত্রিত করার জন্য যুক্ত করা হয়েছে।
লরেন

1
এটি মূলত @ ইভান নসভের উত্তরের মতোই , যদিও এটি আরও বোধগম্যভাবে এখানে ব্যাখ্যা করা হয়েছে
icc97

81

যদিও এটা একটি বিট আরো বাগাড়ম্বরপূর্ণ, আপনি সাধন করতে পারেন কি বাকিদের 2 বছর আগে জন্য আন্ডারস্কোর / lodash সুপারিশ করা হয়েছিল, ব্যবহার করে Array.prototype.reduce

var subset = ['color', 'height'].reduce(function(o, k) { o[k] = elmo[k]; return o; }, {});

এই পদ্ধতিটি এটিকে অন্য দিক থেকে সমাধান করে: উত্তোলনের জন্য কোনও বিষয়বস্তু নিয়ে না গিয়ে সম্পত্তি নামগুলি উত্তরের পরিবর্তে সম্পত্তি নামের একটি অ্যারে নেবে এবং সেগুলিকে একটি নতুন অবজেক্টে কমিয়ে দেয়।

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

সম্পাদনা করুন: এর একই সংস্করণ:

const subset = ['color', 'height'].reduce((a, e) => (a[e] = elmo[e], a), {});

সম্পাদনা করুন: তরকারী করারও একটি দুর্দান্ত উদাহরণ! একটি 'পিক' ফাংশনটি অন্য ফাংশনটি ফিরিয়ে দিন।

const pick = (...props) => o => props.reduce((a, e) => ({ ...a, [e]: o[e] }), {});

উপরের অন্যান্য পদ্ধতির খুব কাছাকাছি, এটি আপনাকে ফ্লাইতে 'পিকার' তৈরি করতে দেয় except যেমন

pick('color', 'height')(elmo);

এই পদ্ধতির সম্পর্কে বিশেষভাবে ঝরঝরে কী, আপনি সহজেই নির্বাচিত 'পিক্স' কোনও ফাংশন গ্রহণ করে এমন কোনও কিছুতে প্রবেশ করতে পারেন, যেমন Array#map:

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]

3
এস -6 এটি তীরের ফাংশনগুলির মাধ্যমে আরও পরিষ্কার হওয়া সম্ভব করে এবং অবজেক্ট.সেসিনের রিটার্ন (যেহেতু কোনও বস্তুর সম্পত্তি অর্পণ করে সম্পত্তি মান দেয়, তবে অবজেক্ট.সেসাইন বস্তুটি ফেরত দেয়))
জোশ Q

আরেকটি এস note দ্রষ্টব্য: আপনার খুব কমই এগুলি আর করা দরকার, যেহেতু আপনি সাধারণত অসাধারণ অ্যাসাইনমেন্ট বা অর্গগুলি করেন। যেমন function showToy({ color, height }) {আপনার সুযোগে কেবল যা প্রয়োজন তা রাখবে put reduceআপনি সিরিয়ালাইজেশনের জন্য অবজেক্টগুলিকে সরলীকরণ করার সময় এ পদ্ধতির মূলত অর্থ হয়।
জোশ কারিবুউ

6
যে ES6 সংস্করণটি কম পারফরম্যান্ট, কারণ এটি প্রতিটি পুনরাবৃত্তির সাথে সমস্ত বৈশিষ্ট্যের একটি অনুলিপি তৈরি করে। এটি ও (এন ^ 2) এ একটি ও (এন) অপারেশন করে। আপনার প্রথম কোড ব্লকের একটি ES6 সমতুল্য হবেconst pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
4:55

@ 4 ক্যাসেল ইয়েপ ভাল কল - এতবার পুনরাবৃত্তি করার কোনও মানে নেই। আমি কমা সিনট্যাক্স পছন্দ করি - একগুচ্ছ রিটার্নের চেয়ে ভাল।
জোশ কেরিবউ

1
@ শেভচেনকো ভিক্টর আমি আসলে এই পদ্ধতিকে আমার মূল এসআই 6 সংস্করণে ব্যবহার করেছি, তবে @ 4 ক্যাসলের মন্তব্যের পরে এটিকে পরিবর্তন করেছি। আমি মনে করি স্প্রেডটি আরও স্পষ্ট, তবে কোডে বৃহত্তর অবজেক্টগুলির পক্ষে এটি একটি বিশাল পার্থক্য যা সহজেই কোনও বাধা হয়ে দাঁড়াতে পারে (উদাহরণস্বরূপ, রিটার্নিং ডেটা থেকে আসা বিলম্বিত fetch), সুতরাং আমি কমা অপারেটর ব্যবহারের ব্যাখ্যা ব্যাখ্যা করার জন্য একটি মন্তব্য যুক্ত করার পরামর্শ দেব।
জোশি

45

ES6 ধ্বংসাত্মক

সিনট্যাক্স তৈরির ফলে ফাংশন প্যারামিটার বা ভেরিয়েবলের সাহায্যে কোনও অবয়বকে পুনঃনির্মাণ এবং পুনঃসংযোগের অনুমতি দেয়।

সীমাবদ্ধতাটি হ'ল কীগুলির একটি তালিকা পূর্বনির্ধারিত, সেগুলিকে স্ট্রিং হিসাবে তালিকাভুক্ত করা যাবে না, যেমন প্রশ্নের উল্লেখ রয়েছে। কোনও কী-অক্ষরবিহীন, উদাহরণস্বরূপ, নির্মাণ আরও জটিল হয়ে ওঠে foo_bar

খারাপ দিকটি হ'ল এর জন্য কীগুলির একটি তালিকা নকল করা দরকার, একটি তালিকা দীর্ঘ হওয়ার ক্ষেত্রে ভার্বোজ কোডের ফলস্বরূপ। যেহেতু ডুপ্লিকেটগুলি এই ক্ষেত্রে অবজেক্ট আক্ষরিক বাক্য গঠন করে, একটি তালিকা অনুলিপি করা যায় এবং সে হিসাবে এটি আটকানো যায়।

উল্টো দিকটি হল এটি পারফরম্যান্স সমাধান যা ES6 এর পক্ষে স্বাভাবিক।

IIFE

let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })

অস্থায়ী পরিবর্তনশীল

let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }

স্ট্রিংগুলির একটি তালিকা

বাছাই করা কীগুলির স্বেচ্ছাসেবী তালিকায় স্ট্রিং থাকে, যেমন প্রশ্ন প্রয়োজন। এটি তাদের পূর্বনির্ধারিত করতে এবং মূল নামগুলির মতো ভেরিয়েবলগুলি ব্যবহার করার অনুমতি দেয় likepick(obj, 'foo', someKey, ...moreKeys)

প্রতিটি জেএস সংস্করণের সাথে একটি ওয়ান-লাইনার সংক্ষিপ্ত হয়ে যায়।

ES5

var subset = Object.keys(obj)
.filter(function (key) { 
  return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
  obj2[key] = obj[key];
  return obj2;
}, {});

ES6

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});

বা কমা অপারেটর সহ:

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});

ES2019

ECMAScript 2017 এর রয়েছে Object.entriesএবং Array.prototype.includes, ECMAScript 2019 রয়েছে Object.fromEntries, তারা যখন প্রয়োজন হয় তখন পলিফিল করা যায় এবং কাজটি আরও সহজ করে তোলে:

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

লোড্যাশেরpick অনুরূপ সাহায্যকারী ফাংশন হিসাবে বা omitকীগুলির তালিকাটি আর্গুমেন্টগুলির মাধ্যমে পাস করা হয় সেখানে একটি ওয়ানলাইনার পুনরায় লেখা যেতে পারে :

let pick = (obj, ...keys) => Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => keys.includes(key))
);

let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }

অনুপস্থিত কীগুলি সম্পর্কে একটি নোট

ডেস্ট্রাকচারিং এবং প্রচলিত লোড্যাশের মতো pickফাংশনের মধ্যে প্রধান পার্থক্য হ'ল ডেস্ট্রাকচারিংয়ে undefinedএকটি উপসেটের মান সহ অস্তিত্বহীন বাছাই করা কীগুলি অন্তর্ভুক্ত করা হয়:

(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }

এই আচরণটি কাম্য হতে পারে বা নাও হতে পারে। সিনট্যাক্স বিনষ্ট করার জন্য এটি পরিবর্তন করা যায় না।

যদিও pickবাছাই করা কী-একটি তালিকা iterating পরিবর্তে দ্বারা অনুপস্থিত কী অন্তর্ভুক্ত করা পরিবর্তন করা যাবে:

let inclusivePick = (obj, ...keys) => Object.fromEntries(
  keys.map(key => [key, obj[key]])
);

let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }

11
কী উত্তর লজ্জাজনক যে এই উত্তরটি সাম্প্রতিক এবং সুতরাং এটির প্রাপ্য তা প্রকাশ পাচ্ছে না। আইএমও এটি সম্পূর্ণতা, সরলতা, বহুমুখিতা এবং ন্যায়বিচারের জন্য গৃহীত উত্তর হওয়া উচিত। আমি আমার সবচেয়ে দরকারী স্নিপেট লাইব্রেরিতে ES6 সংস্করণ রাখব।
ভ্যানআলবার্ট

ES5 - "অপ্রকাশিত রেফারেন্স এরর: ওজেক্ট সংজ্ঞায়িত করা হয়নি"
নিখিল ভারতাক

@ নিখিলভারতাক এটি প্রত্যাশা করে যে objভেরিয়েবল এমন একটি পরিবর্তনশীল যা কোনও বস্তু সঞ্চয় করে। যদি আপনার পরিবর্তনশীল নাম পৃথক হয় তবে এটির পরিবর্তে এটি ব্যবহার করুন obj
এস্তাস ফ্লাস্ক

আমার খারাপ! আমি অবহেলা Object.keys(obj)। নিদ্রালু।
নিখিল वर्तক

34

মূল লাইব্রেরিতে বিল্ট-ইন-এর মতো কিছুই নেই তবে আপনি এটি করতে অবজেক্ট ডেস্ট্রাকচারিং ব্যবহার করতে পারেন ...

const {color, height} = sourceObject;
const newObject = {color, height};

আপনি এটি করতে একটি ইউটিলিটি ফাংশনও লিখতে পারেন ...

const cloneAndPluck = function(sourceObject, keys) {
    const newObject = {};
    keys.forEach((obj, key) => { newObject[key] = sourceObject[key]; });
    return newObject;
};

const subset = cloneAndPluck(elmo, ["color", "height"]);

লোডাশের মতো গ্রন্থাগারগুলিও রয়েছে _.pick()


1
দুর্দান্ত, আমাকে কেবলমাত্র forEach এ পরিবর্তন করতে হয়েছিল: key.forEach (key => {newObject [key] = SourceObject [key];}) ;. অনুগ্রহ করে মন্তব্যটি আপডেট করুন যদি এটি বোধগম্য হয়।
কান্দন

34

উত্তরটি ব্যবহার করা হয়নি বলেই আমি এই উত্তরটি যুক্ত করছি Comma operator

এটি দিয়ে destructuring assignmentএবং ,অপারেটরটি খুব সহজ

const object = { a: 5, b: 6, c: 7  };
const picked = ({a,c} = object, {a,c})

console.log(picked);

গতিশীল বৈশিষ্ট্য অ্যাসাইনমেন্টের জন্য একটি নির্দিষ্ট বর্ধনের সাথে এটি এর মতো দেখতে পারে:


2
আমার খারাপ, আমি জানি না যে আমি এর আগে যা করেছি এটি কাজ করে নি তবে এটি কাজ করে বলে মনে হচ্ছে
এখিসিস

1
এটি সর্বশ্রেষ্ঠ অভিব্যক্তি, যখন এটি ধ্বংসের দিকে আসে
মুহাম্মদ আল্লাল

1
এই সমাধানটি চতুর, তবে এটি কঠোর মোডে কাজ করে না (যেমন, 'use strict')। আমি একটি পেতে ReferenceError: a is not defined
কিমবাডি

8
নোট করুন যে এই পদ্ধতিটি দুটি ভেরিয়েবলের সাথে বর্তমান স্কোপটিকে দূষিত করে aএবং c- প্রসঙ্গের উপর নির্ভর করে এলোমেলোভাবে স্থানীয় বা বৈশ্বিক ভারগুলি ওভাররাইট না করার বিষয়ে সতর্ক থাকুন be (গৃহীত উত্তর একটি ইনলাইন ফাংশন, যা অবিলম্বে ফাঁসি পর সাধ্যের বাইরে পড়ে দুই স্থানীয় ভেরিয়েবল ব্যবহার করে এই সমস্যা এড়াতে।)
mindplay.dk

2
নেমস্পেস দূষণ এটিকে পুরোপুরি অযৌক্তিক করে তোলে। ইতিমধ্যে স্কোপের ক্ষেত্রে ভেরিয়েবলগুলি থাকা খুব সাধারণ বিষয় যা প্রজেক্টের বৈশিষ্ট্যগুলির সাথে মিলে যায়, এজন্যই প্রোপ শর্টহ্যান্ড + ডিস্ট্রাকচারিং বিদ্যমান V সম্ভবত আপনার উদাহরণের মতো উচ্চতা বা রঙ ইতিমধ্যে সংজ্ঞায়িত হবে।
Qaribou থেকে জোশ

23

আরও একটি সমাধান:

var subset = {
   color: elmo.color,
   height: elmo.height 
}

এটি এখন পর্যন্ত বেশিরভাগ উত্তরের চেয়ে আমার কাছে আরও বেশি পঠনযোগ্য মনে হচ্ছে, তবে সম্ভবত এটি কেবল আমারই!


9
আমি অভিনব, তবে বিভ্রান্তিকর কোড হওয়ার চেয়ে উত্পাদনশীল হওয়া পছন্দ করি এবং বাস্তব জীবনে সফটওয়্যার ইঞ্জিনিয়ারিং এ এটি সবচেয়ে বেশি পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য সমাধান।
জানোস

1
হ্যাঁ, তবে, আমার কাছে, ডেস্ট্রাকচারিং এবং শর্টহ্যান্ড স্বরলিপি ব্যবহারের একটি উল্টোটি হ'ল এটি কম ত্রুটিযুক্ত প্রবণ। যদি আমি প্রতিবারের জন্য একটি পয়সা রাখি আমি ভুল করে কপি করে কোডটি শেষ করে দেওয়ার জন্য নষ্ট করে ফেলতাম তবে আমার subset = {color: elmo.color, height: elmo.color}কমপক্ষে একটি ... ভাল, একটি ডাইম থাকতে পারত।
JHH

এটি শুকনো না
হওয়ায়

আমাকে একমত হতে হবে অযাচিত পরিবর্তনশীলগুলির সাথে প্রসঙ্গকে দূষিত না করে এটি এখন পর্যন্ত সর্বাধিক পঠনযোগ্য সমাধান। বাকি চেহারা খুব বিভ্রান্ত দেখতে। আমি আমার কোডটি দ্বিতীয় দেখছি সেটিকে বুঝতে পছন্দ করি।
অ্যান্ড্রু

11

আপনি লোডাশও ব্যবহার করতে পারেন ।

var subset = _.pick(elmo ,'color', 'height');

পরিপূরক করে, ধরা যাক আপনার কাছে "এলমো" এর একটি অ্যারে রয়েছে:

elmos = [{ 
      color: 'red',
      annoying: true,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'blue',
      annoying: true,
      height: 'known',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'yellow',
      annoying: false,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    }
];

আপনি যদি একই আচরণ চান, লড্যাশ ব্যবহার করে, আপনি ঠিক করবেন:

var subsets = _.map(elmos, function(elm) { return _.pick(elm, 'color', 'height'); });

10

এই প্রশ্নের আলোচিত জাভাস্ক্রিপ্টে গতিশীল নামযুক্ত ভেরিয়েবলগুলি তৈরি করা অসম্ভব ।

করতে সেট চাবি পরিবর্তনশীল , আপনি বস্তুর mutating নিম্নরূপ ছাড়া কাজ কমাতে ব্যবহার করতে পারেন:

const getSubset = (obj, ...keys) => keys.reduce((a, c) => ({ ...a, [c]: obj[c] }), {});

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'color', 'annoying')
console.log(subset)

একক ক্লোন আপডেট করার পরিবর্তে আপনি প্রতিটি পুনরাবৃত্তিতে একটি নতুন অবজেক্ট তৈরি করছেন তা নোট করা উচিত। - এমপেন

নীচে একক ক্লোন সহ হ্রাস ব্যবহার করে একটি সংস্করণ দেওয়া হয়েছে (হ্রাস করতে পাস করা প্রাথমিক মান আপডেট করা)।

const getSubset = (obj, ...keys) => keys.reduce((acc, curr) => {
  acc[curr] = obj[curr]
  return acc
}, {})

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'annoying', 'height', 'meta')
console.log(subset)


1
অসাধারণ! বন্ধনীগুলি কতটা প্রয়োজনীয় [সি]: এটি বুঝতে না পেরে এটি একটি মুহুর্তের জন্য আমাকে ছুঁড়ে ফেলেছিল: আমি ধরে নিচ্ছি যে এটি কোনওভাবে সম্পত্তির নামের পরিবর্তে একটি মান হিসাবে দেখায়। যাইহোক, খুব দুর্দান্ত। +1
জন ফেয়ারব্যাঙ্কস

ধন্যবাদ বন্ধু! জাভাস্ক্রিপ্ট সম্পর্কে আমি যে ব্যবহারটি পছন্দ করি তা হ'ল যা ওয়াল ব্যবহার না করে জেনেরিক ফাংশন সক্ষম করে। সহজভাবে, এটি যা তৈরি করে তা আপনাকে রানটাইমের সময় ভেরিয়েবলের জন্য ডিকের একটি কী সেট করতে দেয়। যদি আপনি var কী = 'someKey' সংজ্ঞায়িত করেন তবে আপনি এটিকে {[key]: 'value' as হিসাবে ব্যবহার করতে পারেন, যা আপনাকে {someKey: 'value'} দেয়} সত্যিই ঠাণ্ডা.
মুহাম্মাদ ইঞ্জিনিয়ার

1
একক ক্লোন আপডেট করার পরিবর্তে আপনি প্রতিটি পুনরাবৃত্তিতে একটি নতুন অবজেক্ট তৈরি করছেন তা নোট করা উচিত।
এমপেইন

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

7

টাইপস্ক্রিপ্ট সমাধান:

export function pick<T extends object, U extends keyof T>(obj: T, paths: Array<U>) {
    return paths.reduce((o, k) => {
        o[k] = obj[k];
        return o;
    }, Object.create(null));
}

এমনকি টাইপিংয়ের তথ্য স্বয়ংক্রিয়ভাবে সমাপ্তির অনুমতি দেয়:

ক্রেডিট DefinitelyTyped জন্য U extends keyof Tকৌতুক!


আমার জন্য কাজ করছে না।
নথিং

@ নোটিং আপনি কি ভিএস কোড ব্যবহার করছেন?
এমপিএন

হ্যাঁ, আমি ভিএস কোড ব্যবহার করি।
নথিং

@ নুটিংিং এবং আপনি এটি একটি .ts ফাইলে রেখেছেন? এটা কাজ করা উচিত। আমি কেবল এটি আবার চেষ্টা করেছি
মেপেন


4

গতিশীল সমাধান

['color', 'height'].reduce((a,b) => (a[b]=elmo[b],a), {})


3

আর একটি উপায় ...

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

var subset = [elmo].map(x => ({
  color: x.color,
  height: x.height
}))[0]

আপনি এই ফাংশনটি অবজেক্টের অ্যারে দিয়ে ব্যবহার করতে পারেন =)


2

কেমন:

function sliceObj(obj) {
  var o = {}
    , keys = [].slice.call(arguments, 1);
  for (var i=0; i<keys.length; i++) {
    if (keys[i] in obj) o[keys[i]] = obj[keys[i]];
  }
  return o;
}

var subset = sliceObj(elmo, 'color', 'height');

সম্পত্তির মান false(বা মিথ্যা) হলে এটি ব্যর্থ হবে । jsfiddle.net/nfAs8
অ্যালেক্সান্ডার

এজন্যই আমি এটিকে পরিবর্তন করেছি keys[i] in obj
elclanrs

2

এটি ক্রোম কনসোলে আমার জন্য কাজ করে। এ নিয়ে কোন সমস্যা?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}

4
এটি দুর্দান্ত পড়ে, তবে দুটি অপ্রয়োজনীয় ভেরিয়েবল, রঙ এবং উচ্চতা তৈরি করে।
user424174

আপনার মন্তব্য বুঝতে না। ওপি-র প্রয়োজনীয়তা ছিল এই দুটি
উপাদানযুক্ত

@ এমএসআই এটি কেবল একটি অবজেক্ট তৈরি করে না, এটি দুটি ভেরিয়েবলও তৈরি করে।
অ্যাড্রিয়ান

1

গতিশীল বৈশিষ্ট্য সহ অ্যাসাইনমেন্ট তৈরি করা

এই সমাধানটি কেবল আপনার নির্দিষ্ট উদাহরণের জন্যই প্রযোজ্য নয় তবে আরও সাধারণভাবে প্রযোজ্য:

const subset2 = (x, y) => ({[x]:a, [y]:b}) => ({[x]:a, [y]:b});

const subset3 = (x, y, z) => ({[x]:a, [y]:b, [z]:c}) => ({[x]:a, [y]:b, [z]:c});

// const subset4...etc.


const o = {a:1, b:2, c:3, d:4, e:5};


const pickBD = subset2("b", "d");
const pickACE = subset3("a", "c", "e");


console.log(
  pickBD(o), // {b:2, d:4}
  pickACE(o) // {a:1, c:3, e:5}
);

subset4আরও সম্পত্তি বিবেচনায় নিতে আপনি সহজেই সংজ্ঞা দিতে পারেন।


1

পুরাতন Array.prototype.reduce:

const selectable = {a: null, b: null};
const v = {a: true, b: 'yes', c: 4};

const r = Object.keys(selectable).reduce((a, b) => {
  return (a[b] = v[b]), a;
}, {});

console.log(r);

এই উত্তরটি ম্যাজিকাল কমা-অপারেটরটিও ব্যবহার করে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / কমা_অপ্রেটার

আপনি যদি সত্যিই অভিনব হতে চান তবে এটি আরও কমপ্যাক্ট:

const r = Object.keys(selectable).reduce((a, b) => (a[b] = v[b], a), {});

এগুলি একসাথে পুনরায় ব্যবহারযোগ্য ফাংশনে রেখে দেওয়া:

const getSelectable = function (selectable, original) {
  return Object.keys(selectable).reduce((a, b) => (a[b] = original[b], a), {})
};

const r = getSelectable(selectable, v);
console.log(r);

1
  1. আর্গুমেন্টগুলিকে অ্যারেতে রূপান্তর করুন

  2. Array.forEach()সম্পত্তি বাছাই করতে ব্যবহার করুন

    Object.prototype.pick = function(...args) {
       var obj = {};
       args.forEach(k => obj[k] = this[k])
       return obj
    }
    var a = {0:"a",1:"b",2:"c"}
    var b = a.pick('1','2')  //output will be {1: "b", 2: "c"}

4
দেশীয় ধরণের প্রোটোটাইপ প্রসারিত করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়, যদিও এটি কার্যকর হবে। আপনি কোনও লাইব্রেরি লিখলে এটি করবেন না।
এমিল বার্গারন

0
function splice()
{
    var ret = new Object();

    for(i = 1; i < arguments.length; i++)
        ret[arguments[i]] = arguments[0][arguments[i]];

    return ret;
}

var answer = splice(elmo, "color", "height");

0

চেষ্টা

const elmo={color:"red",annoying:!0,height:"unknown",meta:{one:"1",two:"2"}};

const {color, height} = elmo; newObject = ({color, height});

console.log(newObject); //{ color: 'red', height: 'unknown' }

0

ইভান নসভের উত্তরে আমার 2 সেন্ট যোগ করা হচ্ছে :

আমার ক্ষেত্রে আমার অবজেক্টের বাইরে থেকে 'কাটা' হতে অনেকগুলি কী দরকার ছিল যাতে এটি খুব কুরুচিপূর্ণ হয়ে উঠছে এবং খুব গতিশীল সমাধান নয়:

const object = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const picked = (({ a, aa, aaa, ab, c, cc, ccc, cd }) => ({ a, aa, aaa, ab, c, cc, ccc, cd }))(object);

console.log(picked);

সুতরাং এখানে eval ব্যবহার করে একটি গতিশীল সমাধান:

const slice = (k, o) => eval(`(${k} => ${k})(o)`);


const object    = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const sliceKeys = '({ a, aa, aaa, ab, c, cc, ccc, cd })';

console.log( slice(sliceKeys, object) );

-2

দ্রষ্টব্য: যদিও জিজ্ঞাসা করা মূল প্রশ্নটি জাভাস্ক্রিপ্টের জন্য ছিল তবে নীচের সমাধানের মাধ্যমে এটি jQuery করা যেতে পারে

আপনি চাইলে আপনি jquery প্রসারিত করতে পারেন এখানে এক টুকরো জন্য নমুনা কোড:

jQuery.extend({
  sliceMe: function(obj, str) {
      var returnJsonObj = null;
    $.each( obj, function(name, value){
        alert("name: "+name+", value: "+value);
        if(name==str){
            returnJsonObj = JSON.stringify("{"+name+":"+value+"}");
        }

    });
      return returnJsonObj;
  }
});

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};


var temp = $.sliceMe(elmo,"color");
alert(JSON.stringify(temp));

এখানে একই জন্য ঝাঁকনি : http://jsfiddle.net/w633z/



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