সাজানো ক্রমে একটি জাভাস্ক্রিপ্ট এসোসিয়েটিভ অ্যারের উপরে আইট্রেট করুন


109

ধরা যাক আমার কাছে জাভাস্ক্রিপ্টের সহযোগী অ্যারে রয়েছে (ওরফে হ্যাশ, ওরফে অভিধান):

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;

আমি কীভাবে সাজানো ক্রমে পুনরুক্তি করতে পারি? যদি এটি জিনিসগুলিকে সরলীকরণে সহায়তা করে তবে আমার কাছে মানগুলিরও দরকার নেই (এগুলি সবই কেবল 1 নম্বর)।


11
আপনি কেন নতুন অ্যারে () কনস্ট্রাক্ট ব্যবহার করছেন এবং তারপরে এটি কোনও অবজেক্টের মতো ব্যবহার করছেন?
লুক শ্যাফার

@ লুক .. আমি পিএইচপি ব্যাকগ্রাউন্ড থেকে এসে প্রথমে এটিও করেছি। আমি যদিও এখন শিখেছি :)
অ্যালেক্স

20
@ লুক: 'কারণ আমি অনভিজ্ঞ, কারণ মনে হচ্ছে। আপনি একটি উত্তরে সঠিক উপায়ে পোস্ট করতে পারেন?
মাইক

4
আপনি কেবল যে কোনও অবজেক্ট তৈরি করতে পারেন। জাভাস্ক্রিপ্টে একটি অভিধান / "নামযুক্ত অ্যারে" এবং একটি নিয়মিত অবজেক্টের মধ্যে পার্থক্য নেই। সুতরাং আপনি আব এবং বিপরীতে একটি ['বি'] অ্যাক্সেস করতে পারেন। একটি অবজেক্ট তৈরির সবচেয়ে সংক্ষিপ্ততম উপায় a = {};
লোডেভিজক

উত্তর:


124

আপনি তাদের উপর সরাসরি পুনরাবৃত্তি করতে পারবেন না তবে আপনি সমস্ত কীগুলি খুঁজে পেতে পারেন এবং তারপরে কেবল সেগুলি সাজান।

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;    

function keys(obj)
{
    var keys = [];

    for(var key in obj)
    {
        if(obj.hasOwnProperty(key))
        {
            keys.push(key);
        }
    }

    return keys;
}

keys(a).sort(); // ["a", "b", "z"]

তবে ভেরিয়েবলটিকে 'অ্যারে' তৈরি করার দরকার নেই। আপনি সত্যই এটি একটি অবজেক্ট হিসাবে ব্যবহার করছেন এবং এটি এটি তৈরি করা উচিত:

var a = {};
a["key"] = "value";

28
আপনার সবসময় forলুপটি পরীক্ষা করা উচিত obj.hasOwnProperty(key)
viam0Zah

3
@ ললিট - যদি আপনি টরোকের মন্তব্যে উল্লেখ করছেন তবে এর কারণ আপনার অবজেক্টের প্রোটোটাইপে কোনও হস্তক্ষেপ নেই, যার উপর আপনি নির্ভর করতে পারবেন না।
লুক স্ক্যাফার

1
টোরকের কাছে +1। উত্তরের উত্তরটি হ'ল ওয়ানপ্রোপার্টি () অন্তর্ভুক্ত করা ভাল would
জন অনস্টট

136

আপনি অবজেক্ট.কিজ অন্তর্নির্মিত পদ্ধতিটি ব্যবহার করতে পারেন :

var sorted_keys = Object.keys(a).sort()

(দ্রষ্টব্য: এটি খুব পুরানো ব্রাউজারগুলিতে ইকামাস্ক্রিপ্ট 5 সমর্থন করে না, বিশেষত আই 6, 7 এবং 8 সমর্থন করে না) বিস্তারিত আপ-টু-ডেট পরিসংখ্যানগুলির জন্য, এই টেবিলটি দেখুন )


@ michael667 সম্ভবত কারণ IE 7 এবং 8 এখনও ব্যাপকভাবে ব্যবহৃত হয় (দুর্ভাগ্যবশত,
এমএসকে

1
ভাগ্যক্রমে, আইআই 7 এখন 0.5% এবং আই 8 এ 8% এ রয়েছে।
মোলনারগ

3
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
জর্দানের রিইটার

আমি এই এক ভালবাসি, আপনাকে ধন্যবাদ। এখানে আমার কোডটি উপকারের জন্য এখানে রয়েছে, $ (অবজেক্ট.কিজ (তালিকা)) মানচিত্র (ফাংশন (i, e) {রিটার্ন এন + '=' + তালিকা [n];}) পান) () & যোগ দিন ('&'); // ইউআরএল ক্যোরিস্ট্রিংয়ের জন্য কনক্যাট
ইলাইন

1
2016 আপডেট: এটি সম্ভবত গ্রহণযোগ্য উত্তর হওয়া উচিত
রিনোগো

14

এমনকি আপনি এটি বস্তুতে প্রোটোটাইপ করতে পারেন:

Object.prototype.iterateSorted = function(worker)
{
    var keys = [];
    for (var key in this)
    {
        if (this.hasOwnProperty(key))
            keys.push(key);
    }
    keys.sort();

    for (var i = 0; i < keys.length; i++)
    {
        worker(this[ keys[i] ]);
    }
}

এবং ব্যবহার:

var myObj = { a:1, b:2 };
myObj.iterateSorted(function(value)
{
    alert(value);
} 

3
আমি এই উত্তরটিকে বেশ ভাল বলে মনে করেছি, তবে এটি জেকারিটি ভেঙে গেছে :( স্ট্যাকওভারফ্লো / প্রশ্ন / 1827458 /… এবং সাধারণভাবে একটি খুব খারাপ ধারণা হিসাবে বিবেচিত হয় "আপনার কখনই অবজেক্ট.প্রোটোটাইপ বাড়ানো উচিত নয় It এটি এর চেয়ে অনেক বেশি কিছু করে ব্রেক jQuery; এটি জাভাস্ক্রিপ্টের "অবজেক্ট-অ্যাস-হ্যাশটেবলস" বৈশিষ্ট্যটিকে পুরোপুরি ভেঙে দেয় it এটি করবেন না John আপনি জন রেসিগকে জিজ্ঞাসা করতে পারেন, এবং তিনি আপনাকে একই কথা বলবেন। "
এমসানজয়

তুমি কি জান? আমি প্রোটোটাইপগুলিও ঘৃণা করি :) আমি সেগুলি কখনই ব্যবহার করি না এবং সক্রিয়ভাবে তাদের ব্যবহারকে নিরুৎসাহিত করি। আমি এই উত্তরটি লিখলাম যখন 3.5 বছর আগে আমি এই ধরণের অনুভূত হয়েছিলাম, তবে যাইহোক এটি প্রস্তাব দিয়েছি ... তথ্য সরবরাহ করার জন্য ধন্যবাদ। একপাশে, ফ্রেমওয়ার্কগুলি ভাঙা উচিত নয় কারণ তাদের পুনরুক্তি করা অবজেক্টগুলি যখন সর্বদা ব্যবহার করা উচিত
হ'ল লুক শ্যাফার

সম্পর্ক বজায় রেখে বাছাইয়ের জন্য কীগুলির পরিবর্তে মানগুলি ব্যবহার না করে এখানে একটি উদাহরণ রয়েছে key -> value
জিওনক্রস

6

আমি সুইংলির উত্তরের সাথে একমত , এবং আমি মনে করি এটি একটি গুরুত্বপূর্ণ বিষয় যা এই আরও বিস্তৃত সমাধানগুলি অনুপস্থিত। আপনি যদি কেবলমাত্র সহযোগী অ্যারেতে কীগুলি নিয়ে উদ্বিগ্ন হন এবং সমস্ত মান '1' হয় তবে কেবল 'কীগুলি' অ্যারের মধ্যে মান হিসাবে সংরক্ষণ করুন।

পরিবর্তে:

var a = { b:1, z:1, a:1 };
// relatively elaborate code to retrieve the keys and sort them

ব্যবহার করুন:

var a = [ 'b', 'z', 'a' ];
alert(a.sort());

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


3

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

যদি তা হয়, এবং আপনার প্রশ্নটি যদি পুনরায় উত্তম হতে পারে "যদি আমি সাজানো ক্রমে চাবিগুলি পুনরুক্ত করতে চাই তবে আমি কী অভিধান-এর মতো অবজেক্টটি ব্যবহার করব?" তাহলে আপনি এটির মতো কোনও বিষয় বিকাশ করতে পারেন:

var a = {
  keys : new Array(),
  hash : new Object(),
  set : function(key, value) {
    if (typeof(this.hash[key]) == "undefined") { this.keys.push(key); }
    this.hash[key] = value;
  },
  get : function(key) {
    return this.hash[key];
  },
  getSortedKeys : function() {
    this.keys.sort();
    return this.keys;
  }
};

// sample use
a.set('b',1);
a.set('z',1);
a.set('a',1);
var sortedKeys = a.getSortedKeys();
for (var i in sortedKeys) { print(sortedKeys[i]); }

যদি ডেটা নিয়মিত বস্তুতে থাকে তবে আপনার যদি নিয়ন্ত্রণ না থাকে তবে এই ইউটিলিটি নিয়মিত বস্তুকে আপনার সম্পূর্ণ-কার্যকরী অভিধানে রূপান্তরিত করবে:

a.importObject = function(object) {
  for (var i in object) { this.set(i, object); }
};

এটি সরলতার জন্য একটি বস্তুর সংজ্ঞা ছিল (পুনরায় ব্যবহারযোগ্য কনস্ট্রাক্টর ফাংশনের পরিবর্তে); ইচ্ছায় সম্পাদনা করুন।


2

প্রথম forলুপে কীগুলি পান , এটি বাছাই করুন, ২ য় forলুপে সাজানো ফলাফলটি ব্যবহার করুন ।

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;

var b = [];
for (k in a) b.push(k);
b.sort();
for (var i = 0; i < b.length; ++i) alert(b[i]);

2

আপনি কীগুলি পেতে আন্ডারস্কোর.জেএস লাইব্রেরি keysথেকে ফাংশনটি ব্যবহার করতে পারেন , তারপরে এটিকে সাজানোর জন্য অ্যারে পদ্ধতি:sort()

var sortedKeys = _.keys(dict).sort();

keysআন্ডারস্কোর এর সোর্স কোডে ফাংশন:

// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
    if (obj !== Object(obj)) throw new TypeError('Invalid object');
    var keys = [];
    for (var key in obj) if (_.has(obj, key)) keys.push(key);
    return keys;
};    

// Shortcut function for checking if an object has a given property directly
// on itself (in other words, not on a prototype).
_.has = function(obj, key) {
    return hasOwnProperty.call(obj, key);
};

0
<script type="text/javascript">
    var a = {
        b:1,
        z:1,
        a:1
    }; // your JS Object
    var keys = [];
    for (key in a) {
        keys.push(key);
    }
    keys.sort();
    var i = 0;
    var keyslen = keys.length;
    var str = '';
    //SORTED KEY ITERATION
    while (i < keyslen) {
        str += keys[i] + '=>' + a[keys[i]] + '\n';
        ++i;
    }
    alert(str);
    /*RESULT:
    a=>1
    b=>1
    z=>1
    */
</script>


0

আমি @ লুকাক-স্ক্যাফারের প্রোটোটাইপ ধারণাটি সত্যিই পছন্দ করি তবে প্রোটোটাইপগুলি নিয়ে তিনি কী বলছেন তাও শুনি। একটি সাধারণ ফাংশন ব্যবহার সম্পর্কে কি?

function sortKeysAndDo( obj, worker ) {
  var keys = Object.keys(obj);
  keys.sort();
  for (var i = 0; i < keys.length; i++) {
     worker(keys[i], obj[keys[i]]);
  }
}

function show( key, value ) {
  document.write( key + ' : ' + value +'<br>' );
}

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;

sortKeysAndDo( a, show);

var my_object = { 'c': 3, 'a': 1, 'b': 2 };

sortKeysAndDo( my_object, show);

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

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