জাভাস্ক্রিপ্টে নাল-কোলেসিং (এলভিস) অপারেটর বা নিরাপদ নেভিগেশন অপারেটর আছে কি?


209

আমি উদাহরণ দিয়ে ব্যাখ্যা করব:

এলভিস অপারেটর (?:)

"এলভিস অপারেটর" জাভার টেরিনারি অপারেটরের একটি সংক্ষিপ্তকরণ। এটি সহজেই যেখানে ব্যবহৃত হয় তার একটি উদাহরণ যদি কোনও অভিব্যক্তিটি মিথ্যা বা শূন্যের দিকে সমাধান করে তবে 'বোধগম্য ডিফল্ট' মানটি ফেরত দেওয়া। একটি সাধারণ উদাহরণ হতে পারে:

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator

নিরাপদ নেভিগেশন অপারেটর (?)

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

def user = User.find( "admin" )           //this might be null if 'admin' does not exist
def streetName = user?.address?.street    //streetName will be null if user or user.address is null - no NPE thrown

9
'এলভিস অপারেটর' সি # তে বিদ্যমান - তবে একে নাল কোলেসিং অপারেটর বলা হয় (অনেক কম উত্তেজনাপূর্ণ) :-)
ক্যামেরন

আপনি যদি একটি বিকল্প বাক্য গঠন চান তবে আপনি কফি স্ক্রিপ্টটি একবার দেখে নিতে পারেন
লাইম

এই প্রশ্নটি এক ধরণের গণ্ডগোল ... এটি 3 টি বিভিন্ন অপারেটরকে মিশ্রিত করছে? : (টের্নি অপারেটর, প্রশ্নে বানান বানিয়েছেন, সম্ভবত একটি টাইপো), ?? (নাল কোয়েলসিং, যা জাভাস্ক্রিপ্টে বিদ্যমান) এবং? (এলভিস) যা জাভাস্ক্রিপ্টে নেই। উত্তরগুলি এই পার্থক্যটি খুব ভালভাবে পরিষ্কার করে না।
জোয়েলফ্যান 10:40 '

2
@ জোয়েলফ্যান ??আপনি জাভাস্ক্রিপ্টে সঠিক নাল-কোলেসেসেন্স ( ) সংক্রান্ত ডকুমেন্টেশনের লিঙ্ক সরবরাহ করতে পারেন ? আমি এখন পর্যন্ত যা কিছু খুঁজে পাচ্ছি তার থেকে বোঝা যায় যে জেএসের কেবল "মিথ্যা" কোয়েলসিং রয়েছে (ব্যবহার করছে ||)।
চার্লস উড

1
আচ্ছা, আমি বলতে চাইছিলাম না যে জেএস আক্ষরিক ছিল ?? তবে এটির শূন্যতা ছিল ... তবে সেখানেও আমি এক প্রকার ভুল ছিল। বলা হচ্ছে, আমি প্রচুর জেএস কোড ব্যবহার করে দেখেছি || নালীর একত্রিত হয়ে যেমন মিথ্যা সমস্যা রয়েছে তবুও
জোয়েলফ্যান

উত্তর:


138

আপনি এলভিস অপারেটরের জায়গায় লজিক্যাল 'ওআর' অপারেটরটি ব্যবহার করতে পারেন:

উদাহরণস্বরূপ displayname = user.name || "Anonymous"

তবে জাভাস্ক্রিপ্টের বর্তমানে অন্য কার্যকারিতা নেই। যদি আপনি বিকল্প সিনট্যাক্স চান তবে আমি কফিস্ক্রিপ্টটি দেখার পরামর্শ দেব । এটিতে কিছুটা শর্টহ্যান্ড রয়েছে যা আপনি যা খুঁজছেন তার অনুরূপ।

উদাহরণস্বরূপ অস্তিত্বশীল অপারেটর

zip = lottery.drawWinner?().address?.zipcode

ফাংশন শর্টকাট

()->  // equivalent to function(){}

সেক্সি ফাংশন কলিং

func 'arg1','arg2' // equivalent to func('arg1','arg2')

মাল্টিলাইন মন্তব্য এবং ক্লাসও রয়েছে। স্পষ্টতই আপনাকে এটি জাভাস্ক্রিপ্টে সংকলন করতে হবে বা পৃষ্ঠাতে প্রবেশ করানো হয়েছে <script type='text/coffeescript>'তবে এটি প্রচুর কার্যকারিতা যুক্ত করে :)। ব্যবহার <script type='text/coffeescript'>করা সত্যিকার অর্থে শুধুমাত্র উন্নয়নের উদ্দেশ্যে এবং উত্পাদন নয়।


14
যৌক্তিক বা বেশিরভাগ ক্ষেত্রে প্রয়োজনীয় জিনিসটির প্রয়োজন হয় না, কারণ আপনি এটি বাম অপরিজ্ঞাত থাকলেই ডান অপরেন্ড বেছে নিতে চান তবে এটি সংজ্ঞায়িত এবং মিথ্যা হিসাবে বর্ণনা করা হয় না।
ব্যবহারকারী2451227

এটা কি আমার ভুল, নাকি সত্যিই <script type='coffee/script>'?
জিসিসিএম

2
কফিস্ক্রিপ্ট হোম পৃষ্ঠা ব্যবহার করে <script type="text/coffeescript">
ইলিয়াস জামারিয়া

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

4
আমি কি কলা যাচ্ছি? অবশ্যই ব্যবহারকারীর 45451227 (বর্তমানে 4 টি ভোট সহ) আপত্তিটি অবৈধ, কারণ অভিব্যক্তি / বাম অপারেন্ডটি সংজ্ঞায়িত ও মিথ্যা বললে টের্নারির মাঝারি অপারেন্ড (যেমন এলভিস অপারেটরের সাথে ডান অপারেন্ড) সমানভাবে নেওয়া হবে না। উভয় ক্ষেত্রেই আপনাকে যেতে হবে x === undefined
মাইকে রডেন্ট

114

আমি মনে করি যে নীচেরগুলি কিছুটা দীর্ঘ হলেও নিরাপদ নেভিগেশন অপারেটরের সমতুল্য:

var streetName = user && user.address && user.address.street;

streetNameতারপরে হয় হয় হয় মান user.address.streetবা undefined

আপনি যদি এটির অন্য কোনওটিতে ডিফল্ট করতে চান তবে উপরের শর্টকাটের সাথে একত্রিত করতে বা দিতে পারেন:

var streetName = (user && user.address && user.address.street) || "Unknown Street";

7
নাল প্রচার এবং নাল একত্রিতকরণ উভয়ের দুর্দান্ত উদাহরণের জন্য এক!
জে উইক

1
এটি বাদ দিয়ে কাজ করে আপনি এটিকে শূন্য বা অপরিবর্তিত
ডেভ কজিনিউ

82

জাভাস্ক্রিপ্ট এর লজিক্যাল বা অপারেটর হয় শর্ট-সার্কিট এবং আপনার 'এলভিস' অপারেটর প্রতিস্থাপন করতে পারেন:

var displayName = user.name || "Anonymous";

যাইহোক, আমার জ্ঞানের সাথে আপনার ?.অপারেটরের সমতুল্য নেই ।


13
+1, আমি ভুলে গিয়েছিলাম ||যে এভাবে ব্যবহার করা যেতে পারে। সচেতন যে এই নয় শুধুমাত্র একসঙ্গে বেড়ে ওঠা হবে যখন অভিব্যক্তি হতে null, কিন্তু যখন এটা undefined এর false, 0অথবা খালি স্ট্রিং।
ক্যামেরন

@ ক্যামেরন, প্রকৃতপক্ষে, তবে এটি প্রশ্নের মধ্যে উল্লেখ করা হয়েছে এবং মনে হয় এটি প্রশ্নকারীর অভিপ্রায়। ""বা 0অপ্রত্যাশিত হতে পারে, যদিও :)
ফ্রেডেরিক হামিদী

72

আমি মাঝেমধ্যে নিম্নলিখিত আইডিয়মটি দরকারী খুঁজে পেয়েছি:

a?.b?.c

এটি আবার লিখতে পারেন:

((a||{}).b||{}).c

বাস্তবে দেখা যায় যে একটি বস্তু ফেরৎ অজানা বৈশিষ্ট্যাবলী পেয়ে undefined, বরং একটি ব্যতিক্রম নিক্ষেপ যেমন উপর তার চাইতে সুবিধা নেয় nullবা undefined, তাই আমরা নাল প্রতিস্থাপন এবং নেভিগেট সামনে একটি খালি বস্তুর সঙ্গে undefined।


14
ঠিক আছে, এটি পড়া কঠিন তবে এটি ভার্ভোজ &&পদ্ধতির চেয়ে ভাল । +1 টি।
চিক্কুর

1
এটি আসলে জাভাস্ক্রিপ্টের একমাত্র আসল নিরাপদ অপারেটর। যৌক্তিক 'ওআর' অপারেটর যা উপরে উল্লিখিত হয়েছে তা অন্য কিছু।
ভাসিলাকিসফিল

@ ফিলিপস আপনি লজিক্যাল ওআর বনাম & পদ্ধতিতে বিভিন্ন আচরণের উদাহরণ দিতে পারেন? আমি কোনও পার্থক্য ভাবতে পারি না
রেড মটরটি

এটি প্রথমে কোনও ভেরিয়েবলকে নির্ধারিত না করে একটি বেনামি মানটি নেভিগেট করার অনুমতি দেয়।
ম্যাট জেনকিনস 13

1
এটা ভালবাসা! সত্যই কার্যকর যদি আপনি কোনও অ্যারে.ফাইন্ড () অপারেশন করার পরে কোনও সামগ্রীর সম্পত্তি পেতে চান যা কোনও ফল না ফেরায়
শিরাজ

24

আমি মনে করি লোডাশ _.get()এখানে যেমন সহায়তা করতে পারে _.get(user, 'name')এবং এর মতো আরও জটিল কাজ_.get(o, 'a[0].b.c', 'default-value')


5
এই পদ্ধতির সাথে আমার মূল সমস্যাটি হ'ল সম্পত্তিগুলির নাম যেহেতু স্ট্রিং হয় তাই আপনি আপনার আইডিইর 100% বিশ্বাসের সাথে
রিফেক্টরিং

21

বর্তমানে একটি খসড়া অনুমান রয়েছে:

https://github.com/tc39/proposal-optional-chaining

https://tc39.github.io/proposal-optional-chaining/

আপাতত, যদিও আমি লোডাশget(object, path [,defaultValue]) বা ডিএলভি ব্যবহার করতে চাইdelve(obj, keypath)

আপডেট (ডিসেম্বর 23, 2019 হিসাবে):

alচ্ছিক শৃঙ্খলা পর্যায় 4 এ চলে গেছে


জাভাস্ক্রিপ্ট মধ্যে Lodash করতে প্রোগ্রামিং আরো স্বাদু
গেকো

2
alচ্ছিক শৃঙ্খলা সবেমাত্র পর্যায় 4 এ স্থানান্তরিত হয়েছে , তাই আমরা এটি ES2020 এ দেখব
নিক পার্সনস

1
@ নিক পার্সনসকে ধন্যবাদ! উত্তর আপডেট করেছেন।
জ্যাক টাক

18

2019 আপডেট

জাভাস্ক্রিপ্ট এখন এলভিস অপারেটর এবং নিরাপদ নেভিগেশন অপারেটর উভয়ের সমতুল্য।


নিরাপদ সম্পত্তি অ্যাক্সেস

ঐচ্ছিক chaining অপারেটর ( ?.) বর্তমানে একটি হল পর্ব 4 এর নাম ECMAScript প্রস্তাব । আপনি আজ এটি ব্যাবেলের সাথে ব্যবহার করতে পারেন

// `undefined` if either `a` or `b` are `null`/`undefined`. `a.b.c` otherwise.
const myVariable = a?.b?.c;

লজিক্যাল এবং অপারেটর ( &&) 'পুরানো', আরো-বাগাড়ম্বরপূর্ণ এই দৃশ্যকল্প হ্যান্ডেল করতে উপায়।

const myVariable = a && a.b && a.c;

একটি ডিফল্ট সরবরাহ করা

Nullish কোয়ালেসিং অপারেটর ( ??) বর্তমানে একটি হল মঞ্চ 3 এর নাম ECMAScript প্রস্তাব । আপনি আজ এটি ব্যাবেলের সাথে ব্যবহার করতে পারেন । অপারেটরের বাম দিকের একটি নালারি মান ( null/ undefined) হলে এটি আপনাকে ডিফল্ট মান সেট করতে দেয় ।

const myVariable = a?.b?.c ?? 'Some other value';

// Evaluates to 'Some other value'
const myVariable2 = null ?? 'Some other value';

// Evaluates to ''
const myVariable3 = '' ?? 'Some other value';

লজিক্যাল বা অপারেটর ( ||) একটি বিকল্প সমাধান কিছুটা ভিন্ন আচরণ সঙ্গে । অপারেটরের বাম-হাতটি মিথ্যা বললে এটি আপনাকে ডিফল্ট মান সেট করতে দেয় । নোট করুন myVariable3নীচের ফলাফল myVariable3উপরে থেকে পৃথক ।

const myVariable = a?.b?.c || 'Some other value';

// Evaluates to 'Some other value'
const myVariable2 = null || 'Some other value';

// Evaluates to 'Some other value'
const myVariable3 = '' || 'Some other value';

1
এই উত্তরের আরও উন্নতি প্রয়োজন। নুলীশ কোলেসিং অপারেটর এখন ৪

13

প্রাক্তনদের জন্য, আপনি ব্যবহার করতে পারেন ||। জাভাস্ক্রিপ্ট "যৌক্তিক" বা "অপারেটর, সহজভাবে ক্যানড করা সত্য এবং মিথ্যা মানগুলি ফিরিয়ে দেওয়ার পরিবর্তে, তার বাম যুক্তিটি যদি সত্য হয় তবে ফেরত দেওয়ার নিয়ম অনুসরণ করে এবং অন্যথায় এটির সঠিক যুক্তিকে মূল্যায়ন ও ফিরিয়ে দেয়। যখন আপনি শুধুমাত্র সত্য মান প্রতি আগ্রহ দেখিয়েছেন এটি একই কাজ, কিন্তু এটি মানে যে foo || bar || bazফেরৎ যে একটি সত্য মান রয়েছে foo বিন্যাস, বার, বা বায এর বামদিকের এক

আপনি এক যে নাল থেকে মিথ্যা, যদিও আলাদা করতে পারেন, এবং 0 পাবে না এবং তাই এড়ানোর ব্যবহার খালি স্ট্রিং, মিথ্যা মান value || defaultকনস্ট্রাক্ট যেখানে valueবৈধভাবে 0 হতে পারে বা ""


4
ভাল কাজ লক্ষণীয় যে বাম অপারেন্ডটি নন-নাল মিথ্যা মান হলে এর ফলে অপ্রত্যাশিত আচরণ হতে পারে।
শোগ

11

হ্যা এখানে! 🍾

Chaচ্ছিক শৃঙ্খলা 4 পর্যায়ে রয়েছে এবং এটি আপনাকে user?.address?.streetসূত্রটি ব্যবহার করতে সক্ষম করে ।

আপনি যদি মুক্তির অপেক্ষা করতে না পারেন তবে ইনস্টল করুন @babel/plugin-proposal-optional-chainingএবং আপনি এটি ব্যবহার করতে পারেন। এখানে আমার সেটিংস যা আমার পক্ষে কাজ করে, বা নিম্মের নিবন্ধটি পড়ুন

// package.json

{
  "name": "optional-chaining-test",
  "version": "1.0.0",
  "main": "index.js",
  "devDependencies": {
    "@babel/plugin-proposal-optional-chaining": "7.2.0",
    "@babel/core": "7.2.0",
    "@babel/preset-env": "^7.5.5"
  }
  ...
}
// .babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "debug": true
      }
    ]
  ],
  "plugins": [
    "@babel/plugin-proposal-optional-chaining"
  ]
}
// index.js

console.log(user?.address?.street);  // it works

4
তিনি জিজ্ঞাসা করেছিলেন সেখানে একটি আছে কিনা, আপনি একটি যুক্ত করতে পারবেন কিনা তা নয়। আমার কাছে মনে হয় এটি যা জিজ্ঞাসিত তা নয়, বিবেচনা করে এটি খুব দরকারী।
ডিনমওকে

2
এটি ECMAScript মানক প্রক্রিয়াটির 3 পর্যায়ে পৌঁছেছে। es2020 🚀 - babeljs.io/docs/en/babel-plugin-proposal-optional-chaining
wedi

আমি মনে করি এই উত্তরটি যেমন বিভ্রান্তিকর।
লিওনার্দো রাইলে

1
এই উত্তরটি বেশ সঠিক নয়! Ptionচ্ছিক শৃঙ্খলা এখনও 3 পর্যায়ে রয়েছে এবং ES2020 এখনও প্রকাশিত হয়নি বা চূড়ান্তও হয়নি। কমপক্ষে আপনি উল্লেখ করেছেন যে কেউ কীভাবে এটি প্রকাশের জন্য অপেক্ষা না করে এটি ব্যবহার করতে পারে।
ম্যাক্সি বার্কম্যান

@ গাজডেগারগো সমস্যা নেই :)।
ম্যাক্সি বার্কম্যান

6

এখানে একটি সাধারণ এলভিস অপারেটর সমতুল্য:

function elvis(object, path) {
    return path ? path.split('.').reduce(function (nestedObject, key) {
        return nestedObject && nestedObject[key];
    }, object) : object;
}

> var o = { a: { b: 2 }, c: 3 };
> elvis(o)

{ a: { b: 2 }, c: 3 }

> elvis(o, 'a');

{ b: 2 }

> elvis(o, 'a.b');

2

> elvis(o, 'x');

undefined

5

সেপ্টেম্বর 2019 আপডেট করুন

হ্যাঁ, জেএস এখন এটি সমর্থন করে। আরও 8 টি পড়তে 8 চ্ছিক শৃঙ্খলা শীঘ্রই আসছে


বেশ একই না. ওপি নাল কোলেসেসিংয়ের বিষয়ে রয়েছে তবে তবুও সুন্দর উত্তর।
ম্যাক্সি বার্কম্যান

4

এটি নাল-কোয়েলসিং অপারেটর হিসাবে বেশি পরিচিত। জাভাস্ক্রিপ্ট একটি নেই।


3
কড়া অর্থে সত্য, তবে অন্যান্য উত্তরে যেমনটি উল্লেখ করা হয়েছে যে জাভাস্ক্রিপ্টের লজিক্যাল ওআর অপারেটর আপনাকে মিথ্যা- কোয়েলেসিং অপারেটর হিসাবে বাছাই করতে পারে, আপনাকে অনেক পরিস্থিতিতে একই বক্রতা অর্জন করতে দেয়।
শোগ

1
এটি কোনও নাল-কোলেসিং অপারেটর নয়। নাল-কোলেসিং কেবলমাত্র একক মান নিয়ে কাজ করে, সম্পত্তি অ্যাক্সেস / ফাংশন অনুরোধের শৃঙ্খলে নয়। আপনি ইতিমধ্যে জাভাস্ক্রিপ্টে লজিক্যাল ওআর অপারেটরের সাথে নাল-কোয়েলসিং করতে পারেন।

না, আপনি জাভাস্ক্রিপ্টে লজিক্যাল ওআর দিয়ে ভ্রান্ত-কোলেসিং করতে পারেন।
andresp


2

আমার এটির জন্য একটি সমাধান আছে, এটি আপনার নিজের প্রয়োজন অনুসারে তৈরি করুন, আমার লিবসের একটি অংশ:

    elvisStructureSeparator: '.',

    // An Elvis operator replacement. See:
    // http://coffeescript.org/ --> The Existential Operator
    // http://fantom.org/doc/docLang/Expressions.html#safeInvoke
    //
    // The fn parameter has a SPECIAL SYNTAX. E.g.
    // some.structure['with a selector like this'].value transforms to
    // 'some.structure.with a selector like this.value' as an fn parameter.
    //
    // Configurable with tulebox.elvisStructureSeparator.
    //
    // Usage examples: 
    // tulebox.elvis(scope, 'arbitrary.path.to.a.function', fnParamA, fnParamB, fnParamC);
    // tulebox.elvis(this, 'currentNode.favicon.filename');
    elvis: function (scope, fn) {
        tulebox.dbg('tulebox.elvis(' + scope + ', ' + fn + ', args...)');

        var implicitMsg = '....implicit value: undefined ';

        if (arguments.length < 2) {
            tulebox.dbg(implicitMsg + '(1)');
            return undefined;
        }

        // prepare args
        var args = [].slice.call(arguments, 2);
        if (scope === null || fn === null || scope === undefined || fn === undefined 
            || typeof fn !== 'string') {
            tulebox.dbg(implicitMsg + '(2)');
            return undefined;   
        }

        // check levels
        var levels = fn.split(tulebox.elvisStructureSeparator);
        if (levels.length < 1) {
            tulebox.dbg(implicitMsg + '(3)');
            return undefined;
        }

        var lastLevel = scope;

        for (var i = 0; i < levels.length; i++) {
            if (lastLevel[levels[i]] === undefined) {
                tulebox.dbg(implicitMsg + '(4)');
                return undefined;
            }
            lastLevel = lastLevel[levels[i]];
        }

        // real return value
        if (typeof lastLevel === 'function') {
            var ret = lastLevel.apply(scope, args);
            tulebox.dbg('....function value: ' + ret);
            return ret;
        } else {
            tulebox.dbg('....direct value: ' + lastLevel);
            return lastLevel;
        }
    },

একটি যাদুমন্ত্র মত কাজ করে. কম ব্যথা উপভোগ করুন!


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

1
আমি যে কোডটি ব্যবহার করব তা থেকে একটি ছোট অংশ তৈরি করব এবং এটি এক সপ্তাহ বা আরও পরে গিটহাবে পোস্ট করব।
বালাজস্ট্থ

2

আপনি নিজের রোল করতে পারেন:

function resolve(objectToGetValueFrom, stringOfDotSeparatedParameters) {
    var returnObject = objectToGetValueFrom,
        parameters = stringOfDotSeparatedParameters.split('.'),
        i,
        parameter;

    for (i = 0; i < parameters.length; i++) {
        parameter = parameters[i];

        returnObject = returnObject[parameter];

        if (returnObject === undefined) {
            break;
        }
    }
    return returnObject;
};

এবং এটি এর মতো ব্যবহার করুন:

var result = resolve(obj, 'a.b.c.d'); 

* ফলাফল, অপরিজ্ঞাত যদি a, b, c বা d এর যে কোনও একটি অপরিবর্তিত থাকে।


1

আমি এই নিবন্ধটি ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-tyypecript ) পড়েছি এবং প্রক্সি ব্যবহার করে সমাধানটি সংশোধন করেছি।

function safe(obj) {
    return new Proxy(obj, {
        get: function(target, name) {
            const result = target[name];
            if (!!result) {
                return (result instanceof Object)? safe(result) : result;
            }
            return safe.nullObj;
        },
    });
}

safe.nullObj = safe({});
safe.safeGet= function(obj, expression) {
    let safeObj = safe(obj);
    let safeResult = expression(safeObj);

    if (safeResult === safe.nullObj) {
        return undefined;
    }
    return safeResult;
}

আপনি এটিকে এভাবে বলেছেন:

safe.safeGet(example, (x) => x.foo.woo)

ফলাফলটি এমন একটি অভিব্যক্তির জন্য সংজ্ঞায়িত হবে যা এর পথ ধরে নাল বা অপরিজ্ঞাতের মুখোমুখি হয়। আপনি বুনো যেতে পারেন এবং অবজেক্ট প্রোটোটাইপ পরিবর্তন করতে পারেন !

Object.prototype.getSafe = function (expression) {
    return safe.safeGet(this, expression);
};

example.getSafe((x) => x.foo.woo);

1

খুব দেরিতে লাফিয়ে লাফানো প্লাগইন [2] উপলভ্য, ২ য় পর্যায়ে alচ্ছিক শৃঙ্খলার জন্য একটি প্রস্তাব [1] রয়েছে। আমি বর্তমানে সচেতন কোন ব্রাউজারে এটি নেই।

  1. https://github.com/tc39/proposal-optional-chaining
  2. https://www.npmjs.com/package/@babel/plugin-proposal-optional-chaining

1

এটি দীর্ঘদিন আমার জন্য সমস্যা ছিল। আমাকে এমন একটি সমাধান নিয়ে আসতে হয়েছিল যা একবার এলভিস অপারেটর বা কিছু পাওয়ার পরে সহজেই সরিয়ে নেওয়া যায়।

এটি আমি ব্যবহার করি; উভয় অ্যারে এবং অবজেক্টের জন্য কাজ করে

এটি সরঞ্জাম.জেএস ফাইল বা কিছুতে রাখুন

// this will create the object/array if null
Object.prototype.__ = function (prop) {
    if (this[prop] === undefined)
        this[prop] = typeof prop == 'number' ? [] : {}
    return this[prop]
};

// this will just check if object/array is null
Object.prototype._ = function (prop) {
    return this[prop] === undefined ? {} : this[prop]
};

ব্যবহারের উদাহরণ:

let student = {
    classes: [
        'math',
        'whatev'
    ],
    scores: {
        math: 9,
        whatev: 20
    },
    loans: [
        200,
        { 'hey': 'sup' },
        500,
        300,
        8000,
        3000000
    ]
}

// use one underscore to test

console.log(student._('classes')._(0)) // math
console.log(student._('classes')._(3)) // {}
console.log(student._('sports')._(3)._('injuries')) // {}
console.log(student._('scores')._('whatev')) // 20
console.log(student._('blabla')._('whatev')) // {}
console.log(student._('loans')._(2)) // 500 
console.log(student._('loans')._(1)._('hey')) // sup
console.log(student._('loans')._(6)._('hey')) // {} 

// use two underscores to create if null

student.__('loans').__(6)['test'] = 'whatev'

console.log(student.__('loans').__(6).__('test')) // whatev

আমি জানি এটি কোডটি কিছুটা অপঠনযোগ্য করে তোলে তবে এটি একটি সহজ একটি লাইনার সমাধান এবং দুর্দান্ত কাজ করে। আমি আশা করি এটি কাউকে সাহায্য করবে :)


0

এটি কিছু মিক্সিন ব্যবহার করে নিরাপদ নেভিগেশন অপারেটরের জন্য একটি আকর্ষণীয় সমাধান ছিল ..

http://jsfiddle.net/avernet/npcmv/

  // Assume you have the following data structure
  var companies = {
      orbeon: {
          cfo: "Erik",
          cto: "Alex"
      }
  };

  // Extend Underscore.js
  _.mixin({ 
      // Safe navigation
      attr: function(obj, name) { return obj == null ? obj : obj[name]; },
      // So we can chain console.log
      log: function(obj) { console.log(obj); }
  });

  // Shortcut, 'cause I'm lazy
  var C = _(companies).chain();

  // Simple case: returns Erik
  C.attr("orbeon").attr("cfo").log();
  // Simple case too, no CEO in Orbeon, returns undefined
  C.attr("orbeon").attr("ceo").log();
  // IBM unknown, but doesn't lead to an error, returns undefined
  C.attr("ibm").attr("ceo").log();

0

আমি একটি প্যাকেজ তৈরি করেছি যা এটি ব্যবহার করা অনেক সহজ করে তোলে।

এনপিএম জসদিগ গিথুব জেএসডিগ

আপনি সাধারণ জিনিস যেমন এবং বিষয় পরিচালনা করতে পারেন:

const world = {
  locations: {
    europe: 'Munich',
    usa: 'Indianapolis'
  }
};

world.dig('locations', 'usa');
// => 'Indianapolis'

world.dig('locations', 'asia', 'japan');
// => 'null'

বা কিছুটা জটিল:

const germany = () => 'germany';
const world = [0, 1, { location: { europe: germany } }, 3];
world.dig(2, 'location', 'europe') === germany;
world.dig(2, 'location', 'europe')() === 'germany';

-6

ব্যক্তিগতভাবে আমি ব্যবহার করি

function e(e,expr){try{return eval(expr);}catch(e){return null;}};

এবং উদাহরণস্বরূপ নিরাপদে পান:

var a = e(obj,'e.x.y.z.searchedField');

2
আপনার প্রথম সত্যই ইওল ব্যবহার করা উচিত নয় । দ্বিতীয়ত এটি এমনকি কাজ করে না: e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')ফেরত দেয় null
পাইলিনাক্স

@Pylinux মূলত কি কাজ হবে e = eval, var a = eval('obj.a.b.c.d')evalএমনকি একটি দ্বিতীয় প্যারামিটারও নেয় না ... বিকাশকারী.মোজিলা.আর.ইন-
ডোরিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.