বাছাই করুন বস্তুর বৈশিষ্ট্য এবং JSON.stringify


103

আমার অ্যাপ্লিকেশনটিতে একটি বৃহত অ্যারে অবজেক্ট রয়েছে, যা আমি স্ট্রিংফাই করে এগুলি ডিস্কে সংরক্ষণ করি। দুর্ভাগ্যক্রমে, অ্যারেতে থাকা বস্তুগুলি যখন হেরফের করা হয় এবং কখনও কখনও প্রতিস্থাপন করা হয়, তখন বস্তুর বৈশিষ্ট্যগুলি বিভিন্ন ক্রমে তালিকাভুক্ত করা হয় (তাদের সৃষ্টির ক্রম?) আমি যখন অ্যারে JSON.stringify () করি এবং এটি সংরক্ষণ করি, তখন একটি ডিফ বিভিন্ন বৈশিষ্ট্যে তালিকাভুক্ত হওয়া বৈশিষ্ট্যগুলি দেখায়, যা ডিফ এবং সংযুক্তকরণের সরঞ্জামগুলিতে আরও ডেটা মার্জ করার চেষ্টা করার সময় বিরক্তিকর হয়।

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

পরামর্শ সর্বাধিক স্বাগত হবে!

একটি ঘনীভূত উদাহরণ:

obj = {}; obj.name="X"; obj.os="linux";
JSON.stringify(obj);
obj = {}; obj.os="linux"; obj.name="X";
JSON.stringify(obj);

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


আপনি যে বিষয়টিকে স্ট্রিংফাই করার চেষ্টা করছেন তার উদাহরণ দিন (জেএসওএন আউটপুট বা জেএস অবজেক্ট আক্ষরিক)
বোজ্যাংলেস

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

4
stackoverflow.com/questions/1359761/sorting-a- javascript-object আপনাকে সাহায্য করতে পারে
সাতপাল

4
@ আরব, আপনি এটি কোথায় খুঁজে পেলেন? দ্রষ্টব্য: এটি কাজ করতে পারে (এবং সম্ভবত বেশিরভাগ সময় করে) তবে আমি বোঝাতে চাইছি যে এটির নিশ্চয়তা নেই।
ডগবার্ট

4
ওপি এখানে। এখানে সম্পত্তি অর্ডারের উপর নির্ভরতা ছিল না, সিরিয়ালযুক্ত ডেটাতে কীভাবে ভিন্নতা এড়ানো যায় সে সম্পর্কে কেবল একটি প্রশ্ন। এটি শেষ পর্যন্ত অ্যারেতে বৈশিষ্ট্যগুলি স্ট্যাশ করে এবং সিরিয়ালাইজেশনের পূর্বে সেগুলি বাছাই করে সমাধান করা হয়েছিল, যেমন নীচের স্বীকৃত উত্তরের মতো।
ইনোভাইন

উত্তর:


80

সহজ, আধুনিক এবং বর্তমানে ব্রাউজার সমর্থিত পদ্ধতিটি কেবল এটি:

JSON.stringify(sortMyObj, Object.keys(sortMyObj).sort());

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

{"a":{"h":4,"z":3},"b":2,"c":1}

আপনি এটি দিয়ে এটি করতে পারেন:

var flattenObject = function(ob) {
    var toReturn = {};

    for (var i in ob) {
        if (!ob.hasOwnProperty(i)) continue;

        if ((typeof ob[i]) == 'object') {
            var flatObject = flattenObject(ob[i]);
            for (var x in flatObject) {
                if (!flatObject.hasOwnProperty(x)) continue;

                toReturn[i + '.' + x] = flatObject[x];
            }
        } else {
            toReturn[i] = ob[i];
        }
    }
    return toReturn;
};

JSON.stringify(sortMyObj, Object.keys(flattenObject(sortMyObj)).sort());

প্রোগ্রামটিমেটিকভাবে এমন কিছু করার জন্য যা আপনি নিজেকে ঝাপটায় করতে পারেন, আপনাকে অবজেক্ট প্রোপার্টিটির নামগুলি একটি অ্যারেতে ঠেকাতে হবে, তারপরে অ্যারে বর্ণমালা অনুসারে বাছাই করতে হবে এবং সেই অ্যারের মাধ্যমে পুনরাবৃত্তি করতে হবে (যা সঠিক ক্রমে হবে) এবং বস্তু থেকে প্রতিটি মান নির্বাচন করুন যে আদেশ "hasOwnProperty" এছাড়াও চেক করা হয় যাতে আপনার কাছে অবশ্যই অবজেক্টের নিজস্ব বৈশিষ্ট্য থাকে। এখানে একটি উদাহরণ:

var obj = {"a":1,"b":2,"c":3};

function iterateObjectAlphabetically(obj, callback) {
    var arr = [],
        i;

    for (i in obj) {
        if (obj.hasOwnProperty(i)) {
            arr.push(i);
        }
    }

    arr.sort();

    for (i = 0; i < arr.length; i++) {
        var key = obj[arr[i]];
        //console.log( obj[arr[i]] ); //here is the sorted value
        //do what you want with the object property
        if (callback) {
            // callback returns arguments for value, key and original object
            callback(obj[arr[i]], arr[i], obj);
        }
    }
}

iterateObjectAlphabetically(obj, function(val, key, obj) {
    //do something here
});

আবার, এটির গ্যারান্টি দেওয়া উচিত যে আপনি বর্ণানুক্রমিক ক্রমে পুনরাবৃত্তি করতে পারেন।

শেষ অবধি, সরলতম উপায়ে এটিকে আরও এগিয়ে নিয়ে যাওয়া, এই লাইব্রেরিটি আপনাকে যে কোনও JSON এর মধ্যে পাস করার জন্য পুনরাবৃত্তি করতে সহায়তা করবে: https://www.npmjs.com/package/json-stable-stringify

var stringify = require('json-stable-stringify');
var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };
console.log(stringify(obj));

আউটপুট

{"a":3,"b":[{"x":4,"y":5,"z":6},7],"c":8}

9
এটি আমি যা এড়াতে চাইছিলাম তা অনেকটাই :) তবে ধন্যবাদ, সঠিক মত মনে হচ্ছে, ভারী যদি সমাধান হয়।
ইনোভাইন

4
এই কোডটিতে একটি বাগ রয়েছে। আপনি obj[i]লুপের জন্য উল্লেখ করতে পারবেন না কারণ iএকটি পূর্ণসংখ্যা এবং সম্পত্তির নাম অগত্যা নয় (সুতরাং এই প্রশ্নটি)। এটা হওয়া উচিত obj[arr[i]]
অ্যান্ড্রু এনসলে

4
কলব্যাকগুলি অ্যাসিক্রোনাস আচরণের জন্য একচেটিয়া নয়।
মার্কসাইজম

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

4
@markyzm এটি ঠিক আছে, আমার ক্ষেত্রে আমাকে কেবল ক্ষেত্রগুলির একটি নির্বাচনকে আরও শক্তিশালী করতে হয়েছিল। সুতরাং, আপনার উত্তর আমাকে পথে ফেলেছে। ধন্যবাদ
বেঞ্জ

39

আমি মনে করি আপনি যদি JSON প্রজন্মের নিয়ন্ত্রণে থাকেন (এবং এটি আপনার মতো মনে হয়) তবে আপনার উদ্দেশ্যগুলির জন্য এটি একটি ভাল সমাধান হতে পারে: json-স্থির-স্ট্রিংফাই

প্রকল্পের ওয়েবসাইট থেকে:

স্ট্রিংফাইড ফলাফলগুলি থেকে ডিটারমিনিটিক হ্যাশগুলি পেতে কাস্টম বাছাইয়ের সাথে ডিটারমিনিস্টিক জেএসওন স্ট্রিংফাই ()

উত্পাদিত জেএসএন যদি নির্ধারিত হয় তবে আপনার এটিকে সহজেই পৃথক / মার্জ করতে সক্ষম হওয়া উচিত।


4
নোট করুন যে রেপো খারাপ অবস্থায় রয়েছে: 3 বছরে আপডেট হয়নি এবং সমাধান না করা সমস্যা এবং অনুরোধগুলি টানুন। আমি মনে করি নতুন কিছু উত্তর সন্ধান করা ভাল।
টম

4
@ টম আরও মনে রাখবেন যে রেপোতে সাপ্তাহিক 5 মিলিয়ন (!) ডাউনলোড রয়েছে। অন্য কথায়, এটি সক্রিয়ভাবে ব্যবহৃত হচ্ছে। 'অমীমাংসিত' ওপেন ইস্যু এবং / অথবা অনুরোধগুলি টিকিয়ে রাখার অর্থ খুব বেশি নয়। লেখক (গুলি) কেবল এই বিষয়গুলি নিয়ে চিন্তা করেন না বা সময় নেই ইত্যাদি every প্রতি লিবিও কয়েক মাস অন্তর আপডেট করার প্রয়োজন হয় না। আসলে, ইমো, সেরা লিবগুলি খুব কম আপডেট হয়। যখন কিছু করা হয়, এটি হয়ে যায়। আমি বলছি না এই প্রকল্পটির কোনও আসল সমস্যা নেই, তবে যদি তা হয় তবে দয়া করে সেগুলি উল্লেখ করুন। এই লিব বিটিডাব্লু এর সাথে আমার কোনও সম্পৃক্ততা নেই।
স্টিজন ডি উইট

ES6 আমার ধারণা অনুমান করা হয়েছে যে এটি নির্দিষ্ট হিসাবে অবজেক্টস (অ-অ্যারে) বাছাই করতে সক্ষম হয়েছে। ব্যবহারকারী সম্পাদনার জন্য আমার এটি দরকার। এমনকি অর্ডার কম্পিউটারের কোনও বিষয় নয়। এটি ব্যবহারকারীদের এটি সম্পাদনা করে। এটা চেষ্টা করার মতো ছিল।
তমুসজেরোয়েস

4
@ টম যা বলেছে তার উপরে, আমি আরও উল্লেখ করতে পারি যে এই প্রকল্পের কোনও রানটাইম নির্ভরতা নেই। এর অর্থ হ'ল যদি এই রেপোতে কোনও সুরক্ষা / রক্ষণাবেক্ষণের সমস্যা না থাকে তবে এটি সম্ভবত বেশ স্থিতিশীল এবং ব্যবহার করা নিরাপদ। এছাড়াও, আমি এটি কেবল ES6 এর সাথে পরীক্ষা করেছি এবং এটি ঠিক কাজ করে বলে মনে হচ্ছে (কমপক্ষে ফায়ারফক্সে)।
ফিল

28

এর দ্বিতীয় যুক্তি হিসাবে আপনি সম্পত্তি নামের একটি সাজানো অ্যারে পাস করতে পারেন JSON.stringify():

JSON.stringify(obj, Object.keys(obj).sort())

4
এই আচরণ সম্পর্কে ডকুমেন্টেড গ্যারান্টি আছে কি?
ধনী রিমার

4
@ রিচরেমার হ্যাঁ, ইসমাস্ক্রিপ্ট স্ট্যান্ডার্ডে , দ্বিতীয় প্যারামিটারটি JSON.stringify()বলা হয় replacerএবং অ্যারে হতে পারে। এটি তৈরি করতে ব্যবহৃত হয় PropertyListযা পরে SerializeJSONObject()ক্রমে বৈশিষ্ট্যগুলি সংযোজন করতে ব্যবহৃত হয় । এটি ECMAScript 5 সাল থেকে নথিভুক্ত করা হয়েছে
খ্রিস্টান ডি'হিউরিউজ

15
মনে রাখবেন যে যদি আপত্তিটি এতে নেস্টেড অবজেক্টগুলিতে থাকে তবে নেস্টেড কীগুলি অবশ্যই দ্বিতীয় যুক্তিতে উপস্থিত থাকতে হবে; অন্যথায়, তারা বাদ দেওয়া হবে! পাল্টা উদাহরণ: > JSON.stringify({a: {c: 1, b: 2}}, ['a']) '{"a":{}}' সমস্ত প্রাসঙ্গিক কীগুলির তালিকা তৈরির একটি (হ্যাকি) উপায় হ'ল জেএসওএন.অস্ট্রাইটি অবজেক্টটি অতিক্রম করতে ব্যবহার করুন: function orderedStringify(obj) { const allKeys = []; JSON.stringify(obj, (k, v) => { allKeys.push(k); return v; }); return JSON.stringify(obj, allKeys.sort()); } উদাহরণ:> orderedStringify({a: {c: 1, b: 2}}) '{"a":{"b":2,"c":1}}'
সাইফ হাকিম

4
অবজেক্ট.কিজ () পুনরাবৃত্ত হয় না । এটি নেস্টেড অ্যারে বা অবজেক্টযুক্ত কোনও বস্তুর পক্ষে কাজ করবে না।
জোর

28

আমি বুঝতে পারি না কেন সর্বকালের সেরা উত্তরের জটিলতা দরকার, সমস্ত কী পুনরাবৃত্তভাবে পেতে। নিখুঁত পারফরম্যান্সের প্রয়োজন না থাকলে, আমার কাছে মনে হয় যে আমরা কেবল JSON.stringify()দু'বার কল করতে পারি , প্রথমবার সমস্ত কীগুলি পেয়েছিলাম এবং দ্বিতীয়বার সত্যই কাজটি করতে পারি। এইভাবে, সমস্ত পুনরাবৃত্তি জটিলতা পরিচালনা করে stringifyএবং আমরা জানি যে এটি এর স্টাফগুলি জানে এবং প্রতিটি বস্তুর প্রকারকে কীভাবে পরিচালনা করতে হয়:

function JSONstringifyOrder( obj, space )
{
    var allKeys = [];
    JSON.stringify( obj, function( key, value ){ allKeys.push( key ); return value; } )
    allKeys.sort();
    return JSON.stringify( obj, allKeys, space );
}

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

6
না, বিষয়টি হ'ল Object.keys()পুনরাবৃত্তিযোগ্য নয়, সুতরাং যদি আপনার মতো কোনও বস্তু থাকে {a: "A", b: {c: "C"} }এবং আপনি এটিতে অবজেক্ট.কিগুলি কল করেন তবে আপনি কেবল কীগুলি পাবেন aএবং পাবেন bনা cJSON.stringifyজেএসওএন সিরিয়ালাইজেশন প্রক্রিয়া দ্বারা পরিচালিত প্রতিটি বস্তুর ধরণের পুনরাবৃত্তি সম্পর্কে সমস্ত কিছু জানে, এটি কোনও বস্তুর মতো বা অ্যারে হোক (এবং এটি উভয়কে সনাক্ত করার জন্য যুক্তিটি ইতিমধ্যে প্রয়োগ করে) তাই এটি আমাদের জন্য সবকিছু সঠিকভাবে পরিচালনা করা উচিত।
জোড়

4
এই সমাধানটি ভালোবাসুন, খুব মার্জিত এবং এটি নিরাপদ বলে ব্যর্থ।
মার্কাস

@ জোর ধন্যবাদ, এটি আমার পক্ষে কাজ করে। অন্য স্নিপেটগুলি আমি চেষ্টা করেছি একরকম বা অন্যভাবে ব্যর্থ।
nevf

14

2018-7-24 আপডেট করুন:

এই সংস্করণটি নেস্টেড অবজেক্টগুলি বাছাই করে এবং অ্যারে সমর্থন করে:

function sortObjByKey(value) {
  return (typeof value === 'object') ?
    (Array.isArray(value) ?
      value.map(sortObjByKey) :
      Object.keys(value).sort().reduce(
        (o, key) => {
          const v = value[key];
          o[key] = sortObjByKey(v);
          return o;
        }, {})
    ) :
    value;
}


function orderedJsonStringify(obj) {
  return JSON.stringify(sortObjByKey(obj));
}

পরীক্ষা ক্ষেত্রে:

  describe('orderedJsonStringify', () => {
    it('make properties in order', () => {
      const obj = {
        name: 'foo',
        arr: [
          { x: 1, y: 2 },
          { y: 4, x: 3 },
        ],
        value: { y: 2, x: 1, },
      };
      expect(orderedJsonStringify(obj))
        .to.equal('{"arr":[{"x":1,"y":2},{"x":3,"y":4}],"name":"foo","value":{"x":1,"y":2}}');
    });

    it('support array', () => {
      const obj = [
        { x: 1, y: 2 },
        { y: 4, x: 3 },
      ];
      expect(orderedJsonStringify(obj))
        .to.equal('[{"x":1,"y":2},{"x":3,"y":4}]');
    });

  });

অবমানিত উত্তর:

ES2016 এর একটি সংক্ষিপ্ত সংস্করণ। Https://stackoverflow.com/a/29622653/94148 থেকে @ কোডেনেমে জমা

function orderedJsonStringify(o) {
  return JSON.stringify(Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {}));
}

সিনট্যাক্স একদম ঠিক নেই। হওয়া উচিত -function orderedJsonStringify(o) { return JSON.stringify(Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})); }
বেন

এটি, আপাতত, সি # ডেটা কন্ট্রাক্ট জসনসিরাইজার এবং "__type" জাসন স্ট্রিংয়ে প্রথম তালিকাভুক্ত না হওয়ার সাথে আমার সমস্যাটি স্থির করেছে। ধন্যবাদ
দই দ্য ওয়াইজ

4
মনে রাখবেন যে খ্রিস্টানদের উত্তরের মতো, নেস্টেড বস্তুগুলির সাথে খারাপ ব্যবহার করে।
ড্যানিয়েল গ্রিসকম

বাছাই করা হয়েছে। আপনি কি सॉ্টবজবাইকি ব্যবহার করতে চাইছেন?
পল লিঞ্চ

দেখে মনে হচ্ছে না যে এটি sortObjByKey()বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সগুলির জন্য পরীক্ষা করে, তাই সাবধান হন, এটি ইনপুট ডেটার উপর নির্ভর করে অসীম লুপে ঝুলতে পারে। উদাহরণ: var objA = {}; var objB = {objA: objA}; objA.objB = objB;-> sortObjByKey(objA);->VM59:6 Uncaught RangeError: Maximum call stack size exceeded
ক্লেসুন


4

এটি সাতপাল সিংহের উত্তর হিসাবে একই

function stringifyJSON(obj){
    keys = [];
    if(obj){
        for(var key in obj){
            keys.push(key);
        }
    }
    keys.sort();
    var tObj = {};
    var key;
    for(var index in keys){
        key = keys[index];
        tObj[ key ] = obj[ key ];
    }
    return JSON.stringify(tObj);
}

obj1 = {}; obj1.os="linux"; obj1.name="X";
stringifyJSON(obj1); //returns "{"name":"X","os":"linux"}"

obj2 = {}; obj2.name="X"; obj2.os="linux";
stringifyJSON(obj2); //returns "{"name":"X","os":"linux"}"

3

আপনি toJSONনিজের অবজেক্টে একটি কাস্টম ফাংশন যুক্ত করতে পারেন যা আপনি আউটপুট কাস্টমাইজ করতে ব্যবহার করতে পারেন। ফাংশনের অভ্যন্তরে, একটি নির্দিষ্ট ক্রমে একটি নতুন অবজেক্টে বর্তমান বৈশিষ্ট্য যুক্ত করার পরে স্ট্রিংটি করা হলে সেই আদেশটি সংরক্ষণ করা উচিত।

এখানে দেখো:

https://developer.mozilla.org/en-US/docs/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / জেএসএন / স্ট্রিংফাইফাই

অর্ডার নিয়ন্ত্রণের জন্য কোনও অন্তর্নির্মিত পদ্ধতি নেই কারণ JSON ডেটা কী দ্বারা অ্যাক্সেস করা।

একটি ছোট উদাহরণ সহ এখানে একটি জিসফিল:

http://jsfiddle.net/Eq2Yw/

মন্তব্য করার চেষ্টা করুন toJSONফাংশনটি - বৈশিষ্ট্যের ক্রমটি বিপরীত। দয়া করে সচেতন হন যে এটি ব্রাউজার-নির্দিষ্ট হতে পারে, অর্থাত অর্ডারিং নির্দিষ্টকরণে অনুমোদিত নয় officially এটি ফায়ারফক্সের বর্তমান সংস্করণে কাজ করে তবে আপনি যদি 100% জোরালো সমাধান চান তবে আপনাকে নিজের স্ট্রিংফায়ার ফাংশনটি লিখতে হতে পারে।

সম্পাদনা করুন:

স্ট্রিংফাইর-অ-বিড়ম্বনাবাদী আউটপুট সম্পর্কিত বিশেষত ব্রাউজারের পার্থক্য সম্পর্কে ড্যাফের বিশদটি সম্পর্কে এই এসও প্রশ্নটি দেখুন:

কীভাবে জেনসন যাচাই করবেন যে কোনও জেএসএন বস্তুটি সংশোধিত হয়নি?


প্রতিটি বস্তুর বৈশিষ্ট্য পরিচিত (এবং বেশিরভাগ স্ট্রিং) তাই আমার নিজের জেএসওএন স্ট্রিংফায়ারটিতে বৈশিষ্ট্যগুলি হার্ডকডিং বাছাইয়ের চেয়ে আরও দ্রুত হতে পারে ...!
ইনোভাইন

'অর্ডারড জসনস্ট্রিংফাই' নীচে প্রায় কাজ করেছে। তবে এটি আমার কাছে আরও ভাল সমাধান বলে মনে হচ্ছে। যখন আমাকে জেসন স্ট্রিংয়ের প্রথম আইটেম হিসাবে সি # ডেটা কন্ট্রাক্ট জসনসিরাইজারের '__type' পেতে হবে। var json = JSON.stringify (myjsonobj, ['__type', 'id', 'পাঠ্য', 'সোমসুবজ' ইত্যাদি .....]); সমস্ত কী তালিকার জন্য কিছুটা ব্যথা।
দই দ্য ওয়াইজ

3

একটি পুনরাবৃত্ত এবং সহজ সরল উত্তর:

function sortObject(obj) {
    if(typeof obj !== 'object')
        return obj
    var temp = {};
    var keys = [];
    for(var key in obj)
        keys.push(key);
    keys.sort();
    for(var index in keys)
        temp[keys[index]] = sortObject(obj[keys[index]]);       
    return temp;
}

var str = JSON.stringify(sortObject(obj), undefined, 4);

reorderনাম পরিবর্তন করা উচিত sortObjectএবং এটি অ্যারে পরিচালনা করে না
জোনাথন গাওরিচ

এটি দেখার জন্য ধন্যবাদ, এবং ওপি-র ইস্যুটি অ্যারে নয়, অবজেক্টগুলি রিসর্ট করছিল।
জেসন পারহাম

@ জোনাথনগারিচ আপনি যেভাবেই অ্যারে বাছাই করবেন, তাদের একটি আদেশ থাকার কথা। একটি অ্যারে [1,2,3] অ্যারের মতো নয় [2,3,1], তবে কোনও বস্তুর কোনও সম্পত্তি অর্ডার নেই। সমস্যাটি হ'ল স্ট্র্যাঙ্কিফিকেশনের পরে হঠাৎ অর্ডারটি গুরুত্বপূর্ণ - 100% সমতুল্য বস্তুর জন্য স্ট্রিং আলাদা হতে পারে। দুর্ভাগ্যক্রমে একটি নির্জনবাদী স্ট্রিংফাইয়ের প্রচেষ্টা যথেষ্ট মনে হয়, উদাহরণস্বরূপ প্যাকেজ: github.com/substack/json-stable-stringify/blob/master/index.js
M Novrre

4
@ মারে - আমার ধারণা আমি যথেষ্ট নির্দিষ্ট ছিলাম না। "অ্যারে পরিচালনা করে না" দ্বারা, আমি বোঝাতে চেয়েছিলাম অ্যারেগুলি ভাঙ্গা, বিনা বাছাই করা না। সমস্যাটি কারণ typeof arr === "object"এটি অ্যারেগুলিকে বস্তুতে রূপান্তরিত করে। উদাহরণস্বরূপvar obj = {foo: ["bar", "baz"]}{ "foo": { "0": "bar", "1": "baz"} }
জোনাথন গাওরিচ

@ if(obj.constructor.prototype !== Object.prototype)
জোনাথনগাওরিচ

3

আপনি ইকামাস্ক্রিপ্ট 2015 এ সম্পত্তি নাম অনুসারে বস্তু বাছাই করতে পারেন

function sortObjectByPropertyName(obj) {
    return Object.keys(obj).sort().reduce((c, d) => (c[d] = obj[d], c), {});
}

সম্ভবত একটি ভাল নাম sortObjectPropertiesByName()বা আরও সহজ হতে পারে sortPropertiesByName()
জানুয়ারী

3

আমি @ জেসন পারহামের কাছ থেকে উত্তর নিয়েছি এবং কিছু উন্নতি করেছি

function sortObject(obj, arraySorter) {
    if(typeof obj !== 'object')
        return obj
    if (Array.isArray(obj)) {
        if (arraySorter) {
            obj.sort(arraySorter);
        }
        for (var i = 0; i < obj.length; i++) {
            obj[i] = sortObject(obj[i], arraySorter);
        }
        return obj;
    }
    var temp = {};
    var keys = [];
    for(var key in obj)
        keys.push(key);
    keys.sort();
    for(var index in keys)
        temp[keys[index]] = sortObject(obj[keys[index]], arraySorter);       
    return temp;
}

এটি অ্যারেগুলিকে বস্তুতে রূপান্তরিত করার বিষয়টি স্থির করে এবং এটি আপনাকে অ্যারেগুলি বাছাই করার পদ্ধতি নির্ধারণ করতে দেয়।

উদাহরণ:

var data = { content: [{id: 3}, {id: 1}, {id: 2}] };
sortObject(data, (i1, i2) => i1.id - i2.id)

আউটপুট:

{content:[{id:1},{id:2},{id:3}]}

2

গৃহীত উত্তরটি কোনও কারণে নেস্টেড অবজেক্টের জন্য কাজ করে না। এটি আমাকে নিজের কোড আপ করতে পরিচালিত করেছে। যেহেতু 2019 এর শেষের দিকে, যখন আমি এটি লিখব, ভাষার মধ্যে আরও কয়েকটি বিকল্প উপলব্ধ।

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

function normalize(sortingFunction) {
  return function(key, value) {
    if (typeof value === 'object' && !Array.isArray(value)) {
      return Object
        .entries(value)
        .sort(sortingFunction || undefined)
        .reduce((acc, entry) => {
          acc[entry[0]] = entry[1];
          return acc;
        }, {});
    }
    return value;
  }
}

JSON.stringify(obj, normalize(), 2);

-

REতিহাসিক রেফারেন্সের জন্য এই পুরাতন সংস্করণটি রাখা

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

function flattenEntries([key, value]) {
  return (typeof value !== 'object')
    ? [ [ key, value ] ]
    : [ [ key, value ], ...Object.entries(value).flatMap(flattenEntries) ];
}

function sortedStringify(obj, sorter, indent = 2) {
  const allEntries = Object.entries(obj).flatMap(flattenEntries);
  const sorted = allEntries.sort(sorter || undefined).map(entry => entry[0]);
  return JSON.stringify(obj, sorted, indent);
}

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

const obj = {
  "c": {
    "z": 4,
    "x": 3,
    "y": [
      2048,
      1999,
      {
        "x": false,
        "g": "help",
        "f": 5
      }
    ]
  },
  "a": 2,
  "b": 1
};

console.log(sortedStringify(obj, null, 2));

মুদ্রণ:

{
  "a": 2,
  "b": 1,
  "c": {
    "x": 3,
    "y": [
      2048,
      1999,
      {
        "f": 5,
        "g": "help",
        "x": false
      }
    ],
    "z": 4
  }
}

আপনার যদি পুরানো জাভাস্ক্রিপ্ট ইঞ্জিনগুলির সাথে সামঞ্জস্যতা থাকতেই পারে তবে আপনি এই সামান্য আরও ভার্বোজ সংস্করণগুলি ব্যবহার করতে পারেন যা ফ্ল্যাটম্যাপ আচরণ অনুকরণ করে। ক্লায়েন্টকে অবশ্যই কমপক্ষে ES5 সমর্থন করতে হবে, তাই কোনও ইন্টারনেট এক্সপ্লোরার 8 বা তার নিচে নয়।

এগুলি উপরের মত একই ফলাফলকে ফিরিয়ে দেবে।

function flattenEntries([key, value]) {
  if (typeof value !== 'object') {
    return [ [ key, value ] ];
  }
  const nestedEntries = Object
    .entries(value)
    .map(flattenEntries)
    .reduce((acc, arr) => acc.concat(arr), []);
  nestedEntries.unshift([ key, value ]);
  return nestedEntries;
}

function sortedStringify(obj, sorter, indent = 2) {
  const sortedKeys = Object
    .entries(obj)
    .map(flattenEntries)
    .reduce((acc, arr) => acc.concat(arr), [])
    .sort(sorter || undefined)
    .map(entry => entry[0]);
  return JSON.stringify(obj, sortedKeys, indent);
}

1

লোডাশ, নেস্টেড অবজেক্টস, অবজেক্ট অ্যাট্রিবিউটের যে কোনও মান নিয়ে কাজ করে:

function sort(myObj) {
  var sortedObj = {};
  Object.keys(myObj).sort().forEach(key => {
    sortedObj[key] = _.isPlainObject(myObj[key]) ? sort(myObj[key]) : myObj[key]
  })
  return sortedObj;
}
JSON.stringify(sort(yourObj), null, 2)

এটি ক্রোমের এবং নোডের আচরণের উপর নির্ভর করে যে কোনও বস্তুর জন্য নির্ধারিত প্রথম কীটি প্রথমে আউটপুট হয় JSON.stringify


4
ধন্যবাদ, তবে 4 বছর আগে আমার এই সমস্যাটি ছিল, আমি তখন খুশি বলে আমি খুশি হয়েছি :)
ইনোভাইন

4
:) এটা শুনে ভালো লাগলো. যদিও গতকাল আমার এই সমস্যা হয়েছিল এবং আমি আপনার (পুরানো তবে এখনও প্রাসঙ্গিক) প্রশ্নের অধীনে আমি যে উত্তরটি খুঁজছিলাম তার সন্ধান করতে পারি না :)
এজেপি

0

চেষ্টা করুন:

function obj(){
  this.name = '';
  this.os = '';
}

a = new obj();
a.name = 'X',
a.os = 'linux';
JSON.stringify(a);
b = new obj();
b.os = 'linux';
b.name = 'X',
JSON.stringify(b);

ধন্যবাদ, তবে দৃশ্যত অর্ডারটি অনির্ধারিত এবং কেবলমাত্র কাজেই ঘটে। আকর্ষণীয় পদ্ধতির যদিও!
ইনোভাইন

0

আমি অবজেক্টটি বাছাই করতে একটি ফাংশন করেছি এবং কলব্যাক দিয়ে .. যা আসলে একটি নতুন অবজেক্ট তৈরি করে

function sortObj( obj , callback ) {

    var r = [] ;

    for ( var i in obj ){
        if ( obj.hasOwnProperty( i ) ) {
             r.push( { key: i , value : obj[i] } );
        }
    }

    return r.sort( callback ).reduce( function( obj , n ){
        obj[ n.key ] = n.value ;
        return obj;
    },{});
}

এবং এটি বস্তুর সাথে কল করুন।

var obj = {
    name : "anu",
    os : "windows",
    value : 'msio',
};

var result = sortObj( obj , function( a, b ){
    return a.key < b.key  ;    
});

JSON.stringify( result )

যা মুদ্রণ করে {"value":"msio","os":"windows","name":"anu"}এবং মান অনুসারে বাছাই করার জন্য।

var result = sortObj( obj , function( a, b ){
    return a.value < b.value  ;    
});

JSON.stringify( result )

যা প্রিন্ট করে {"os":"windows","value":"msio","name":"anu"}


4
ভাল কাজ করে, তবে দুর্ভাগ্যক্রমে এটি পুনরাবৃত্ত হয় না।
জোনাথন গাওরিচ

0

তালিকায় থাকা বস্তুগুলির যদি একই বৈশিষ্ট্য না থাকে তবে স্ট্রিংফাইয়ের আগে সম্মিলিত মাস্টার অবজেক্ট তৈরি করুন:

let arr=[ <object1>, <object2>, ... ]
let o = {}
for ( let i = 0; i < arr.length; i++ ) {
  Object.assign( o, arr[i] );
}
JSON.stringify( arr, Object.keys( o ).sort() );


0
function FlatternInSort( obj ) {
    if( typeof obj === 'object' )
    {
        if( obj.constructor === Object )
        {       //here use underscore.js
            let PaireStr = _( obj ).chain().pairs().sortBy( p => p[0] ).map( p => p.map( FlatternInSort ).join( ':' )).value().join( ',' );
            return '{' + PaireStr + '}';
        }
        return '[' + obj.map( FlatternInSort ).join( ',' ) + ']';
    }
    return JSON.stringify( obj );
}

// উদাহরণ হিসাবে নীচে। প্রতিটি স্তরে, {} এর মতো অবজেক্টের জন্য কী সাজাতে চ্যাপ্টা করে। অ্যারে, সংখ্যা বা স্ট্রিংয়ের জন্য, JSON.stringify এর মতো / সমতল করুন।

ফ্ল্যাটারআইনসোর্ট ({সি: 9, বি: {y: 4, জেড: 2, ই: 9}, এফ: 4, এ: [{জে: 8, এইচ: 3},: এ: 3, বি: 7}] })

"{" এফ ": 4," এ ": [{" এইচ ": 3," জে ": 8}, {" এ ": 3," বি ": 7}]," বি ": {" ই " : 9, "y": 4, "z": 2}, "গ": 9} "


কেন একটি বাহ্যিক lib ব্যবহার করে দয়া করে তা ব্যাখ্যা করুন, এবং @ ডেকনাএসজন যেমন বলেছেন, কিছু ব্যাখ্যা এবং একটি ভূমিকা যুক্ত করুন। এটি প্রশংসা হবে।
বেঞ্জ

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

0

অ্যারে হ্যান্ডল করতে এজেপির উত্তর প্রসারিত করা:

function sort(myObj) {
    var sortedObj = {};
    Object.keys(myObj).sort().forEach(key => {
        sortedObj[key] = _.isPlainObject(myObj[key]) ? sort(myObj[key]) : _.isArray(myObj[key])? myObj[key].map(sort) : myObj[key]
    })
    return sortedObj;
}

0

অবাক হয়ে কেউ লোডাসের isEqualকার্যকারিতা উল্লেখ করেনি ।

সেগুলি সমতুল্য কিনা তা নির্ধারণ করতে দুটি মানের মধ্যে একটি গভীর তুলনা সম্পাদন করে।

দ্রষ্টব্য: এই পদ্ধতিটি অ্যারে, অ্যারে বাফারস, বুলিয়ানস, তারিখ অবজেক্টস, ত্রুটিযুক্ত বস্তু, মানচিত্র, সংখ্যা, অবজেক্ট অবজেক্টস, রেজেক্সেস, সেটস, স্ট্রিংস, সিম্বলস এবং টাইপ করা অ্যারের সাথে তুলনা করে সমর্থন করে। অবজেক্ট অবজেক্টগুলি তাদের নিজস্ব দ্বারা তুলনা করা হয়, উত্তরাধিকারসূত্রে প্রাপ্ত নয়, অসংখ্য গুণাবলী। ক্রিয়াকলাপ এবং ডোম নোডগুলি কঠোর সমতার সাথে তুলনা করা হয়, যেমন ===।

https://lodash.com/docs/4.17.11#isEqual

মূল সমস্যাটির সাথে - কীগুলি বেমানানভাবে আদেশ করা হয়েছে - এটি একটি দুর্দান্ত সমাধান - এবং অবশ্যই যদি এটি পুরো বস্তুকে অন্ধভাবে সিরিয়ালাইজ করার পরিবর্তে কোনও বিরোধ খুঁজে পায় তবে এটি বন্ধ হবে।

পুরো লাইব্রেরি আমদানি এড়াতে আপনি এটি করুন:

import { isEqual } from "lodash-es";

বোনাস উদাহরণ: আপনি এই কাস্টম অপারেটরের সাথে আরএক্সজেএস এর সাথেও এটি ব্যবহার করতে পারেন

export const distinctUntilEqualChanged = <T>(): MonoTypeOperatorFunction<T> => 
                                                pipe(distinctUntilChanged(isEqual));

0

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

function stableStringify (obj) {
  const keys = new Set()
  const getAndSortKeys = (a) => {
    if (a) {
      if (typeof a === 'object' && a.toString() === '[object Object]') {
        Object.keys(a).map((k) => {
          keys.add(k)
          getAndSortKeys(a[k])
        })
      } else if (Array.isArray(a)) {
        a.map((el) => getAndSortKeys(el))
      }
    }
  }
  getAndSortKeys(obj)
  return JSON.stringify(obj, Array.from(keys).sort())
}

0

এখানে একটি ক্লোন পদ্ধতির ... জেসসনে রূপান্তর করার আগে অবজেক্টটির ক্লোন করুন:

function sort(o: any): any {
    if (null === o) return o;
    if (undefined === o) return o;
    if (typeof o !== "object") return o;
    if (Array.isArray(o)) {
        return o.map((item) => sort(item));
    }
    const keys = Object.keys(o).sort();
    const result = <any>{};
    keys.forEach((k) => (result[k] = sort(o[k])));
    return result;
}

যদি খুব নতুন হয় তবে প্যাকেজ.জসন ফাইলগুলিতে কাজ করে মনে হচ্ছে।


-3

এমন একটি Array.sortপদ্ধতি রয়েছে যা আপনার পক্ষে সহায়ক হতে পারে। উদাহরণ স্বরূপ:

yourBigArray.sort(function(a,b){
    //custom sorting mechanism
});

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

4
@ ইনভোভাইন, এমনকি এটি কাজ করে না কারণ কীগুলি নির্দিষ্ট সময়ের জন্য সৃষ্টির সময় দ্বারা আদেশ দেওয়ার নিশ্চয়তা দেয় না।
ডগবার্ট

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

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