কীভাবে টাইপ-এয়ারর সমাধান করবেন: অবজ্ঞাত বা শূন্য বস্তুকে রূপান্তর করতে পারবেন না


92

আমি বেশ কয়েকটি ফাংশন লিখেছি যা কার্যকরভাবে JSON.stringify () এর প্রতিলিপি তৈরি করে, বিভিন্ন মানের মানকে স্ট্রিংফাইড সংস্করণে রূপান্তর করে। আমি যখন আমার কোডটি জেএসবিনে পোর্ট করি এবং কিছু নমুনা মানগুলিতে চালিত করি, এটি ঠিক ঠিক কাজ করে। তবে আমি এটি পরীক্ষা করার জন্য ডিজাইন করা একটি বিশেষ রানারটিতে এই ত্রুটিটি পাচ্ছি।

আমার কোড:

  // five lines of comments
  var stringify = function(obj) {
  if (typeof obj === 'function') { return undefined;}  // return undefined for function
  if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
  if (typeof obj === 'number') { return obj;} // number unchanged
  if (obj === 'null') { return null;} // null unchanged
  if (typeof obj === 'boolean') { return obj;} // boolean unchanged
  if (typeof obj === 'string') { return '\"' + obj + '\"';} // string gets escaped end-quotes
  if (Array.isArray(obj)) { 
    return obj.map(function (e) {  // uses map() to create new array with stringified elements
        return stringify(e);
    });
  } else {
    var keys = Object.keys(obj);   // convert object's keys into an array
    var container = keys.map(function (k) {  // uses map() to create an array of key:(stringified)value pairs
        return k + ': ' + stringify(obj[k]);
    });
    return '{' + container.join(', ') + '}'; // returns assembled object with curly brackets
  }
};

var stringifyJSON = function(obj) {
    if (typeof stringify(obj) != 'undefined') {
        return "" + stringify(obj) + "";
    }
};

পরীক্ষকটির কাছ থেকে আমি যে ত্রুটি বার্তাটি পেয়েছি তা হ'ল:

TypeError: Cannot convert undefined or null to object
    at Function.keys (native)
    at stringify (stringifyJSON.js:18:22)
    at stringifyJSON (stringifyJSON.js:27:13)
    at stringifyJSONSpec.js:7:20
    at Array.forEach (native)
    at Context.<anonymous> (stringifyJSONSpec.js:5:26)
    at Test.Runnable.run (mocha.js:4039:32)
    at Runner.runTest (mocha.js:4404:10)
    at mocha.js:4450:12
    at next (mocha.js:4330:14)

এটি ব্যর্থ বলে মনে হচ্ছে: উদাহরণস্বরূপ স্ট্রিংফাইজেএসএন (নাল)


4
দয়া করে ইনপুটটি সরবরাহ করুন যার জন্য আপনি ত্রুটি পাচ্ছেন, স্ট্রিংফাইজেএসএন ({এ: 'বি', সি: 'ডি'}) এর জন্য কাজ করে
বিনায়াকজ

4
ত্রুটিটি বাদ দিয়ে, stringifyJSON([1,2,3])রিটার্ন 1,2,3এবং stringifyJSON({foo: 'bar'})রিটার্ন {foo: "bar"}, উভয়ই বৈধ জেএসএন নয়।
ফেলিক্স ক্লিং

4
আমার অনুমানটি এই লাইনটি if (obj === 'null') { return null;} // null unchangedহবে - যখন দেওয়া হবে তখন তা পাস করবে না null, কেবল স্ট্রিং দিলে "null"। সুতরাং আপনি যদি nullআপনার স্ক্রিপ্টে আসল মানটি পাস করেন তবে এটি কোডের অবজেক্ট অংশে পার্স হবে। এবং উল্লেখ Object.keys(null)নিক্ষেপ TypeError। এটি সংশোধন করতে, if(obj === null) {return null}চারপাশে কৌটগুলি ছাড়াই - ব্যবহার করুন null
Veproza

4
অন্য সমস্যা: আপনার কোডটি "স্ট্রিংগুলিতে এম্বেড করা অক্ষরের সম্ভাবনাটি পরিচালনা করে না ।
পয়েন্টি

@ পয়েন্টি - হ্যাঁ, এর জন্য আমাকে কিছু যুক্তি যুক্ত করতে হবে ... ধন্যবাদ
জাহাববা

উত্তর:


134

জেনেরিক উত্তর

এই ত্রুটিটি তখন ঘটে যখন আপনি কোনও ফাংশনটি কল করেন যা কোনও অবজেক্টটিকে তার আর্গুমেন্ট হিসাবে প্রত্যাশা করে , তবে পরিবর্তে অপরিজ্ঞাত বা নাল পাস করে, উদাহরণস্বরূপ

Object.keys(null)
Object.assign(window.UndefinedVariable, {})

যেহেতু সাধারণত ভুল হয়ে থাকে, সমাধানটি হ'ল আপনার কোডটি যাচাই করা এবং নাল / অপরিজ্ঞাত শর্তটি ঠিক করা যাতে ফাংশনটি হয় কোনও সঠিক অবজেক্ট পায় , বা একেবারেই কল না পায়।

Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
    Object.assign(window.UndefinedVariable, {})
}

প্রশ্নের কোড সম্পর্কিত নির্দিষ্ট উত্তর দিন

স্ট্রিং দেওয়া if (obj === 'null') { return null;} // null unchanged হলে রেখাটি মূল্যায়ন করবে না । সুতরাং আপনি যদি আপনার স্ক্রিপ্টে আসল মানটি পাস করেন তবে এটি কোডের অবজেক্ট অংশে পার্স হবে। এবং উল্লেখ নিক্ষেপ । এটি ঠিক করতে, ব্যবহার করুন - শূন্যের চারপাশে কউউটিস ছাড়াই।null"null"nullObject.keys(null)TypeErrorif(obj === null) {return null}


8
হাইলাইট: "এবং উল্লিখিত Object.keys(null)নিক্ষেপ TypeError।"
falsarella

4
এটি যেখানে ঘটে তার আর একটি সাধারণ উদাহরণ যুক্ত করতে: delete obj.propertyযেখানেobj===null
জিও

4

নিশ্চিত করুন যে গন্তব্য অবজেক্টটি খালি নয় ( nullবা undefined)।

আপনি নীচের মত ফাঁকা বস্তু দিয়ে গন্তব্য অবজেক্টটি সূচনা করতে পারেন:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

2

নাল বা অপরিজ্ঞাত বস্তুর বৈশিষ্ট্য অ্যাক্সেস করার সময় ত্রুটিগুলি এড়াতে এটি খুব দরকারী।

অপরিজ্ঞাত বস্তু নাল

const obj = null;
const newObj = obj || undefined;
// newObj = undefined

খালি বস্তুর অপরিজ্ঞাত

const obj; 
const newObj = obj || {};
// newObj = {}     
// newObj.prop = undefined, but no error here

খালি বস্তু নাল

const obj = null;
const newObj = obj || {};
// newObj = {}  
// newObj.prop = undefined, but no error here

0

আমি একটি প্রতিক্রিয়া নেটিভ প্রকল্পে একই সমস্যাটি সমাধান করেছি। আমি এটি ব্যবহার করে এটি সমাধান করেছি।

let data = snapshot.val();
if(data){
  let items = Object.values(data);
}
else{
  //return null
}

0

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


0

প্রতিস্থাপন

if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
if (obj === 'null') { return null;} // null unchanged

সঙ্গে

if (obj === undefined) { return undefined;} // return undefined for undefined 
if (obj === null) { return null;} // null unchanged

0

আপনি যদি লারাভেল ব্যবহার করেন তবে আমার সমস্যাটি আমার রুটের নামে ছিল। পরিবর্তে:

Route::put('/reason/update', 'REASONController@update');

আমি লিখেছিলাম:

Route::put('/reason/update', 'RESONController@update');

এবং যখন আমি নিয়ামকের নামটি স্থির করি, কোডটি কাজ করে!


0

আমার ক্ষেত্রে আমার অতিরিক্ত জুটি বন্ধনী ছিল had ()

পরিবর্তে

export default connect(
  someVariable
)(otherVariable)()

এটা ছিল

export default connect(
  someVariable
)(otherVariable)

0

নীচে স্নিপেটটি বোঝার জন্য যথেষ্ট যে আমি কীভাবে একই সমস্যার মুখোমুখি হয়েছি কিন্তু ভিন্ন দৃশ্যে এবং গ্রহণযোগ্য উত্তরের গাইডেন্সটি ব্যবহার করে আমি কীভাবে এটি সমাধান করেছি। আমার ক্ষেত্রে আমি অবজেক্ট.কিজ () পদ্ধতিটি ব্যবহার করে 'ডিফল্টভিউ ডেটা' অ্যারের 0 তম সূচকে উপস্থিত অবজেক্টের কীগুলি লগ করার চেষ্টা করছিলাম।

defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] 

console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));

কনসোল.লগ মুদ্রিত হচ্ছে না এবং আমি এই প্রশ্নের পোস্টের মতো একই ত্রুটি পাচ্ছিলাম। এই ত্রুটিটি রোধ করতে আমি নীচে শর্ত যুক্ত করেছি

    if(this.props.defaultViewData[0]) {
  console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}

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

দ্রষ্টব্য: এটি React.js কোড। (যদিও সমস্যাটি বোঝার জন্য এটি কোনও বিষয় নয়)।


-2

ওয়েবফর্মের একটি উপাদান নিয়ে আমার একই সমস্যা রয়েছে। সুতরাং আমি এটি স্থির করতে যা করেছি তা বৈধ ছিল। যদি (অবজেক্ট === 'নাল') কিছু করে

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