আমি কীভাবে নেস্টেড অবজেক্টস, অ্যারে বা জেএসওএন অ্যাক্সেস এবং প্রক্রিয়া করতে পারি?


874

আমার কাছে নেস্টেড ডেটা স্ট্রাকচার রয়েছে যাতে অবজেক্ট এবং অ্যারে রয়েছে। আমি কীভাবে তথ্য বের করতে পারি, অর্থাত্ কোনও নির্দিষ্ট বা একাধিক মান (বা কী) অ্যাক্সেস করতে পারি?

উদাহরণ স্বরূপ:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

আমি কীভাবে nameদ্বিতীয় আইটেমটির অ্যাক্সেস করতে পারি items?


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

উত্তর:


1159

preliminaries

জাভাস্ক্রিপ্টের একমাত্র ডেটা টাইপ রয়েছে যাতে একাধিক মান থাকতে পারে: অবজেক্ট । একটি অ্যারে অবজেক্টের একটি বিশেষ ফর্ম।

(সরল) অবজেক্টগুলির ফর্ম রয়েছে

{key: value, key: value, ...}

অ্যারে ফর্ম আছে

[value, value, ...]

অ্যারে এবং অবজেক্ট উভয়ই একটি key -> valueকাঠামো প্রকাশ করে । একটি অ্যারের কীগুলি অবশ্যই সংখ্যাসূচক হতে হবে, যেখানে কোনও স্ট্রিং অবজেক্টে কী হিসাবে ব্যবহার করা যেতে পারে। কী-মান জোড়গুলিকে "বৈশিষ্ট্য " ও বলা হয় ।

বৈশিষ্ট্যগুলি ডট নোটেশন ব্যবহার করে অ্যাক্সেস করা যায়

const value = obj.someProperty;

বা ব্র্যাকেট স্বরলিপি , যদি সম্পত্তিটির নাম বৈধ জাভাস্ক্রিপ্ট সনাক্তকারী নাম না হয় [স্পেস] , বা নামটি একটি ভেরিয়েবলের মান:

// the space is not a valid character in identifier names
const value = obj["some Property"];

// property name as variable
const name = "some Property";
const value = obj[name];

সেই কারণে, অ্যারে উপাদানগুলিকে কেবল বন্ধনী চিহ্নিতকরণ ব্যবহার করে অ্যাক্সেস করা যেতে পারে:

const value = arr[5]; // arr.5 would be a syntax error

// property name / index as variable
const x = 5;
const value = arr[x];

অপেক্ষা করুন ... জেএসওনের কী হবে?

জেএসএন হ'ল এক্সএমএল, ওয়াইএএমএল, সিএসভি এবং অন্যান্যদের মতো ডেটাগুলির পাঠ্য উপস্থাপনা। এই জাতীয় ডেটা নিয়ে কাজ করার জন্য, প্রথমে এটি জাভাস্ক্রিপ্ট ডেটা ধরণের, যেমন অ্যারে এবং অবজেক্টগুলিতে রূপান্তর করতে হবে (এবং কীভাবে কীভাবে এটি ব্যাখ্যা করা হয়েছিল) explained JSON কে পার্স করবেন কীভাবে জাভাস্ক্রিপ্টে পার্স জেএসএন প্রশ্নে ব্যাখ্যা করা হয়েছে ?

আরও পড়ার উপাদান

অ্যারে এবং অবজেক্টগুলিকে কীভাবে অ্যাক্সেস করবেন তা মূল জাভাস্ক্রিপ্ট জ্ঞান এবং তাই এমডিএন জাভাস্ক্রিপ্ট গাইড , বিশেষত বিভাগগুলি পড়ার পরামর্শ দেওয়া হচ্ছে



নেস্টেড ডেটা স্ট্রাকচার অ্যাক্সেস করা

নেস্টেড ডেটা স্ট্রাকচার হ'ল একটি অ্যারে বা অবজেক্ট যা অন্যান্য অ্যারে বা অবজেক্টকে বোঝায়, অর্থাত্ এর মানগুলি অ্যারে বা অবজেক্ট। ক্রমাগত বিন্দু বা বন্ধনী চিহ্নিতকরণ প্রয়োগ করে এই জাতীয় কাঠামো অ্যাক্সেস করা যায়।

এখানে একটি উদাহরণ:

const data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

ধরে নেওয়া যাক আমরা nameদ্বিতীয় আইটেমটির অ্যাক্সেস করতে চাই ।

এখানে কীভাবে আমরা তা ধাপে ধাপে করতে পারি:

যেহেতু আমরা দেখতে পাচ্ছি dataএকটি অবজেক্ট, তাই আমরা ডট নোটেশন ব্যবহার করে এর বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারি। itemsসম্পত্তি নিম্নরূপ অ্যাক্সেস করা হয়:

data.items

মানটি একটি অ্যারে, এর দ্বিতীয় উপাদানটি অ্যাক্সেস করতে আমাদের বন্ধনী স্বরলিপি ব্যবহার করতে হবে:

data.items[1]

এই মানটি একটি অবজেক্ট এবং nameসম্পত্তিটি অ্যাক্সেস করতে আমরা আবার বিন্দু চিহ্নিতকরণ ব্যবহার করি । সুতরাং আমরা শেষ পর্যন্ত পেতে:

const item_name = data.items[1].name;

বিকল্পভাবে, আমরা কোনও বৈশিষ্ট্যের জন্য বন্ধনী চিহ্নিতকরণ ব্যবহার করতে পারতাম, বিশেষত যদি নামেরটিতে এমন অক্ষর থাকে যা বিন্দু চিহ্নিতকরণ ব্যবহারের জন্য এটি অবৈধ করে তুলেছিল:

const item_name = data['items'][1]['name'];

আমি কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করছি তবে আমি কেবল undefinedফিরে পাব ?

আপনি যখন বেশিরভাগ সময় পাচ্ছেন undefinedতখন অবজেক্ট / অ্যারেতে কেবল সেই নামে কোনও সম্পত্তি থাকে না।

const foo = {bar: {baz: 42}};
console.log(foo.baz); // undefined

ব্যবহারের console.logবা console.dirএবং বস্তুর / অ্যারের গঠন পরিদর্শন। আপনি যে সম্পত্তিটি অ্যাক্সেস করার চেষ্টা করছেন সেটি বাস্তবে কোনও নেস্টেড অবজেক্ট / অ্যারেতে সংজ্ঞায়িত করা যেতে পারে।

console.log(foo.bar.baz); // 42

যদি সম্পত্তির নামগুলি গতিশীল হয় এবং আমি তাদের আগে জানতাম না?

অবস্থায় বৈশিষ্টগুলির নাম অজানা বা আমরা একটি বস্তুর সব সম্পত্তি অ্যাক্সেস করতে চান তাহলে / একটি অ্যারের উপাদান, আমরা ব্যবহার করতে পারি for...in [MDN] অবজেক্টের জন্য লুপ এবং for [MDN] সব সম্পত্তি / উপাদান পুনরুক্তি করা অ্যারে জন্য লুপ।

অবজেক্টস

সমস্ত বৈশিষ্ট্যের dataউপর পুনরাবৃত্তি করতে, আমরা এই জাতীয় বস্তুর উপর পুনরাবৃত্তি করতে পারি :

for (const prop in data) {
    // `prop` contains the name of each property, i.e. `'code'` or `'items'`
    // consequently, `data[prop]` refers to the value of each property, i.e.
    // either `42` or the array
}

বস্তুটি কোথা থেকে এসেছে (এবং আপনি কী করতে চান) তার উপর নির্ভর করে আপনাকে প্রতিটি পুনরাবৃত্তিতে পরীক্ষা করতে হবে সম্পত্তিটি আসলে বস্তুর সম্পত্তি, না এটি উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তি is আপনি Object#hasOwnProperty [MDN] এর সাথে এটি করতে পারেন ।

বিকল্প হিসাবে for...inসঙ্গে hasOwnProperty, আপনি ব্যবহার করতে পারেন Object.keys [MDN] একটি পেতে অবস্থায় বৈশিষ্টগুলির নাম অ্যারে :

Object.keys(data).forEach(function(prop) {
  // `prop` is the property name
  // `data[prop]` is the property value
});

অ্যারেগুলির

data.items অ্যারের সমস্ত উপাদানগুলির উপর পুনরাবৃত্তি করতে , আমরা একটি forলুপ ব্যবহার করি :

for(let i = 0, l = data.items.length; i < l; i++) {
    // `i` will take on the values `0`, `1`, `2`,..., i.e. in each iteration
    // we can access the next element in the array with `data.items[i]`, example:
    // 
    // var obj = data.items[i];
    // 
    // Since each element is an object (in our example),
    // we can now access the objects properties with `obj.id` and `obj.name`. 
    // We could also use `data.items[i].id`.
}

কেউ for...inঅ্যারেগুলিতে পুনরাবৃত্তি করতেও ব্যবহার করতে পারে তবে এর কারণগুলি এড়ানো উচিত কারণগুলি: জাভাস্ক্রিপ্টে অ্যারেগুলি খারাপ অনুশীলন হিসাবে বিবেচিত অ্যারের সাথে কেন 'তালিকার ক্ষেত্রে (আইটেমের জন্য)' কেন?

ECMAScript 5 এর ক্রমবর্ধমান ব্রাউজারের সমর্থন সহ, অ্যারে পদ্ধতি forEach [MDN] পাশাপাশি একটি আকর্ষণীয় বিকল্পে পরিণত হয়েছে:

data.items.forEach(function(value, index, array) {
    // The callback is executed for each element in the array.
    // `value` is the element itself (equivalent to `array[index]`)
    // `index` will be the index of the element in the array
    // `array` is a reference to the array itself (i.e. `data.items` in this case)
}); 

ES2015 (ES6) সমর্থনকারী পরিবেশে, আপনি [MDN] লুপটিও ব্যবহার করতে পারেন যা কেবল অ্যারেগুলিতেই নয়, যে কোনও পুনরাবৃত্তির জন্যও কার্যকর :for...of

for (const item of data.items) {
   // `item` is the array element, **not** the index
}

প্রতিটি পুনরাবৃত্তিতে for...ofসরাসরি আমাদের পুনরাবৃত্তির পরবর্তী উপাদানটি দেয়, অ্যাক্সেস বা ব্যবহারের জন্য কোনও "সূচক" নেই।


ডাটা স্ট্রাকচারের "গভীরতা" আমার অজানা থাকলে কী হবে?

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

তবে যদি ডেটা স্ট্রাকচারটিতে পুনরাবৃত্তি প্যাটার্ন থাকে, যেমন একটি বাইনারি গাছের উপস্থাপনা, তবে সমাধানটিতে সাধারণত পুনরাবৃত্তভাবে [উইকিপিডিয়া] ডাটা স্ট্রাকচারের প্রতিটি স্তরের অ্যাক্সেস অন্তর্ভুক্ত থাকে।

বাইনারি গাছের প্রথম পাতার নোড পাওয়ার উদাহরণ এখানে রয়েছে:

function getLeaf(node) {
    if (node.leftChild) {
        return getLeaf(node.leftChild); // <- recursive call
    }
    else if (node.rightChild) {
        return getLeaf(node.rightChild); // <- recursive call
    }
    else { // node must be a leaf node
        return node;
    }
}

const first_leaf = getLeaf(root);

অজানা কী এবং গভীরতার সাথে নেস্টেড ডেটা স্ট্রাকচার অ্যাক্সেস করার আরও সাধারণ উপায় হ'ল মানের ধরণটি পরীক্ষা করা এবং সে অনুযায়ী কাজ করা।

এখানে একটি উদাহরণ রয়েছে যা নেস্টেড ডেটা স্ট্রাকচারের অভ্যন্তরে সমস্ত আদিম মানগুলিকে অ্যারেতে যুক্ত করে (এটি ধরে নিলে এটিতে কোনও কার্য থাকে না)। যদি আমরা কোনও বস্তুর (বা অ্যারে) মুখোমুখি হই তবে আমরা কেবল toArrayসেই মানটিতে পুনরায় কল করি (পুনরাবৃত্ত কল)।

function toArray(obj) {
    const result = [];
    for (const prop in obj) {
        const value = obj[prop];
        if (typeof value === 'object') {
            result.push(toArray(value)); // <- recursive call
        }
        else {
            result.push(value);
        }
    }
    return result;
}



সাহায্যকারী

যেহেতু একটি জটিল অবজেক্ট বা অ্যারের কাঠামো অগত্যা সুস্পষ্ট নয়, আমরা কীভাবে আরও সরানো যায় তা সিদ্ধান্ত নিতে প্রতিটি পদক্ষেপে মানটি পরীক্ষা করতে পারি। console.log [এমডিএন] এবং console.dir [এমডিএন] এটি করতে আমাদের সহায়তা করে। উদাহরণস্বরূপ (Chrome কনসোলের আউটপুট):

> console.log(data.items)
 [ Object, Object ]

এখানে আমরা দেখতে পাচ্ছি যে এটি data.itemsদুটি উপাদান সহ একটি অ্যারের যা উভয় বস্তু। ক্রোম কনসোলে অবজেক্টগুলি এমনকি তত্ক্ষণাত প্রসারিত এবং পরিদর্শন করা যেতে পারে।

> console.log(data.items[1])
  Object
     id: 2
     name: "bar"
     __proto__: Object

এটি আমাদের জানায় যে data.items[1]এটি একটি বস্তু এবং এটি প্রসারণের পরে আমরা দেখতে পাচ্ছি যে এর তিনটি বৈশিষ্ট্য রয়েছে id, nameএবং __proto__। পরেরটি হ'ল অভ্যন্তরীণ সম্পত্তি যা অবজেক্টটির প্রোটোটাইপ চেইনের জন্য ব্যবহৃত হয়। প্রোটোটাইপ চেইন এবং উত্তরাধিকার যদিও এই উত্তরের সুযোগের বাইরে নয়।


3
এখানে যা লিঙ্ক করা হচ্ছে তার কয়েকটি জ্যাকুয়ারিতে কীভাবে এটি করবেন তা জিজ্ঞাসা করছেন, যা ন্যায্য হতে হবে এখানে 1 বা 2 টি জিনিস সহজ করে simp এটিকে আরও একটি মেগাপোস্ট তৈরি করতে হবে বা আলাদাভাবে উত্তর দেওয়া হবে কিনা তা নিশ্চিত নয় - একটি অ্যারে কী এমন একটি বস্তু যা আসলে কী তা জিজ্ঞাসা করা হয় তা নিয়ে এখানে মূল বিষয়গুলি আবৃত ...
ক্রিস মোসচিনি

1
@ ফেলিক্স-ক্লিং একটি জিনিস ... নেস্টেড অবজেক্টের সাথে, যেমন let object = {a: 1, b: 2, c: { a: 3, b: 4 }};, এটি প্রতিটি নেস্টেড অবজেক্টের জন্য একটি অ্যারে যুক্ত করে দেয়, [ 1, 2, [ 3, 4 ] ]এক্ষেত্রে ধাক্কা না দিয়ে পুনরাবৃত্ত কলটিতে কনক্যাট ব্যবহার করা ভাল কি না? (ফলাফলটি পরিবর্তনযোগ্য হতে হবে)
এলফিটস

3
এটি স্ট্যাক ওভারফ্লোতে আমি এর মধ্যে সবচেয়ে গভীর উত্তর পেয়েছি - এবং এটি আমার প্রশ্নের উত্তর দিয়েছে! ধন্যবাদ!
উইলিয়াম জোন্স

এই একটি পৃষ্ঠা আমাকে
এআরএই

76

আপনি এটি এইভাবে অ্যাক্সেস করতে পারেন

data.items[1].name

অথবা

data["items"][1]["name"]

উভয় উপায় সমান।


হ্যাঁ তবে আপনি ডেটা ["আইটেম"] করতে পারবেন না 1. 1.নাম
নিউমিউজিক

5
প্রথমটি আরও বেশি স্বজ্ঞাত, পঠনযোগ্য এবং খাটো;) আমি যখন সম্পত্তিটির নাম পরিবর্তনশীল তখন বন্ধনী সম্পত্তি সিনট্যাক্স ব্যবহার করতে পছন্দ করি।
দান্তে স্মিথ

35

আপনি যদি অ্যারেটিতে অবস্থানটি না জেনে itemউদাহরণের কাঠামো থেকে কোনও অ্যাক্সেসের চেষ্টা করছেন idবা nameনা করে থাকেন তবে এটি করার সহজতম উপায় হ'ল আন্ডারস্কোর.জেএস লাইব্রেরি ব্যবহার করা :

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

_.find(data.items, function(item) {
  return item.id === 2;
});
// Object {id: 2, name: "bar"}

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

শুধু আমার 2 সেন্ট।


29

অবজেক্টস এবং অ্যারেগুলির মধ্যে অনেকগুলি অন্তর্নির্মিত পদ্ধতি রয়েছে যা আপনাকে ডেটা প্রক্রিয়াকরণে সহায়তা করতে পারে।

নোট: উদাহরণ আমি ব্যবহার করছি অনেক তীর ফাংশন । এগুলি ফাংশন এক্সপ্রেশনগুলির সাথে সমান , তবে তারা thisমানটিকে বর্ণিতভাবে আবদ্ধ করে ।

Object.keys(), Object.values()(ইএস 2017) এবং Object.entries()(ইএস 2017)

Object.keys()অবজেক্টের কীগুলির Object.values()একটি অ্যারে প্রদান করে, বস্তুর মানগুলির Object.entries()একটি অ্যারে প্রদান করে এবং বিন্যাসে অবজেক্টের কী এবং আনুষঙ্গিক মানগুলির একটি অ্যারে প্রদান করে [key, value]

const obj = {
  a: 1
 ,b: 2
 ,c: 3
}

console.log(Object.keys(obj)) // ['a', 'b', 'c']
console.log(Object.values(obj)) // [1, 2, 3]
console.log(Object.entries(obj)) // [['a', 1], ['b', 2], ['c', 3]]

Object.entries() একটি লুপ এবং ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট সহ

const obj = {
  a: 1
 ,b: 2
 ,c: 3
}

for (const [key, value] of Object.entries(obj)) {
  console.log(`key: ${key}, value: ${value}`)
}

Object.entries()একটি লুপ এবং ডিস্ট্রাকচারিং অ্যাসাইনমেন্ট সহ ফলাফল পুনরাবৃত্তি করা খুব সুবিধাজনক ।

লুপের জন্য আপনাকে অ্যারে উপাদানগুলি পুনরাবৃত্তি করতে দেয়। বাক্যবিন্যাসটি হ'ল for (const element of array)(আমরা এর constসাথে প্রতিস্থাপন করতে পারি varবা let, তবে constপরিবর্তনের উদ্দেশ্যে না হলে এটি ব্যবহার করা ভাল element)।

অস্ট্রাকচারিং অ্যাসাইনমেন্ট আপনাকে অ্যারে বা কোনও অবজেক্ট থেকে মানগুলি বের করতে এবং এগুলি ভেরিয়েবলগুলিতে নির্ধারণ করতে দেয়। এই ক্ষেত্রে এর const [key, value]অর্থ হ'ল [key, value]অ্যারেটিকে বরাদ্দ করার পরিবর্তে elementআমরা সেই অ্যারের প্রথম উপাদানটিকে keyএবং দ্বিতীয় উপাদানটিকে নির্ধারিত করি value। এটি এর সমতুল্য:

for (const element of Object.entries(obj)) {
  const key = element[0]
       ,value = element[1]
}

আপনি দেখতে পাচ্ছেন যে ধ্বংসগুলি এটিকে অনেক সহজ করে তুলেছে।

Array.prototype.every() এবং Array.prototype.some()

every()পদ্ধতি আয় trueনিদিষ্ট কলব্যাক ফাংশন আয় যদি trueজন্য যে অ্যারের উপাদান। some()পদ্ধতি আয় trueযদি নির্দিষ্ট করা কলব্যাক ফাংশন আয় trueজন্য কিছু (অন্তত একটি) উপাদান।

const arr = [1, 2, 3]

// true, because every element is greater than 0
console.log(arr.every(x => x > 0))
// false, because 3^2 is greater than 5
console.log(arr.every(x => Math.pow(x, 2) < 5))
// true, because 2 is even (the remainder from dividing by 2 is 0)
console.log(arr.some(x => x % 2 === 0))
// false, because none of the elements is equal to 5
console.log(arr.some(x => x === 5))

Array.prototype.find() এবং Array.prototype.filter()

find()পদ্ধতি ফেরৎ প্রথম উপাদান যা সন্তুষ্ট প্রদান কলব্যাক ফাংশন। filter()পদ্ধতির একটি বিন্যাস দেখায় সব উপাদান যা সন্তুষ্ট প্রদান কলব্যাক ফাংশন।

const arr = [1, 2, 3]

// 2, because 2^2 !== 2
console.log(arr.find(x => x !== Math.pow(x, 2)))
// 1, because it's the first element
console.log(arr.find(x => true))
// undefined, because none of the elements equals 7
console.log(arr.find(x => x === 7))

// [2, 3], because these elements are greater than 1
console.log(arr.filter(x => x > 1))
// [1, 2, 3], because the function returns true for all elements
console.log(arr.filter(x => true))
// [], because none of the elements equals neither 6 nor 7
console.log(arr.filter(x => x === 6 || x === 7))

Array.prototype.map()

map()পদ্ধতি অ্যারের উপাদানে একটি প্রদত্ত কলব্যাক ফাংশন কলিং ফলাফল সঙ্গে একটি বিন্যাস দেখায়।

const arr = [1, 2, 3]

console.log(arr.map(x => x + 1)) // [2, 3, 4]
console.log(arr.map(x => String.fromCharCode(96 + x))) // ['a', 'b', 'c']
console.log(arr.map(x => x)) // [1, 2, 3] (no-op)
console.log(arr.map(x => Math.pow(x, 2))) // [1, 4, 9]
console.log(arr.map(String)) // ['1', '2', '3']

Array.prototype.reduce()

reduce()পদ্ধতি দুটি উপাদান সাথে উপলব্ধ করা কলব্যাক ফাংশন কল করে একটি একক মান একটি অ্যারের হ্রাস করা হয়।

const arr = [1, 2, 3]

// Sum of array elements.
console.log(arr.reduce((a, b) => a + b)) // 6
// The largest number in the array.
console.log(arr.reduce((a, b) => a > b ? a : b)) // 3

reduce()পদ্ধতি একটি ঐচ্ছিক দ্বিতীয় প্যারামিটারটি, যা প্রাথমিক মান সময় লাগে। আপনি যখন যে অ্যারেতে কল করেন reduce()তার শূন্য বা একটি উপাদান থাকতে পারে এটি দরকারী । উদাহরণস্বরূপ, আমরা যদি এমন কোনও ফাংশন তৈরি করতে চাই sum()যা একটি অ্যারেটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সমস্ত উপাদানগুলির যোগফল ফেরত দেয় তবে আমরা এটি লিখতে পারি:

const sum = arr => arr.reduce((a, b) => a + b, 0)

console.log(sum([]))     // 0
console.log(sum([4]))    // 4
console.log(sum([2, 5])) // 7


এটি আমার প্রিয় উত্তর। লুপের জন্য আপনি কেবল একটি সুনির্দিষ্ট নেস্টেড ডেটা উদাহরণ যোগ করতে পারেনObject.keys(data["items"]).forEach(function(key) { console.log(data["items"][key].id); console.log(data["items"][key].name); });
সিলভারসুরফার

25

অনেক সময় স্ট্রিং ব্যবহার করে নেস্টেড অবজেক্ট অ্যাক্সেস করা বাঞ্ছনীয়। সাধারণ পদ্ধতির প্রথম স্তরটি উদাহরণস্বরূপ

var obj = { hello: "world" };
var key = "hello";
alert(obj[key]);//world

তবে প্রায়শই জটিল জসনের ক্ষেত্রে এটি হয় না। জসন আরও জটিল হয়ে উঠার সাথে সাথে জসনের অভ্যন্তরের মানগুলি খুঁজে পাওয়ার জন্য পদ্ধতিগুলিও জটিল হয়ে ওঠে। জসন নেভিগেট করার জন্য একটি পুনরাবৃত্তিমূলক পদ্ধতি সর্বোত্তম, এবং কীভাবে পুনরাবৃত্তিটি উত্তোলন করা হয় তা অনুসন্ধান করা তথ্যের ধরণের উপর নির্ভর করবে। যদি শর্তযুক্ত বিবৃতি জড়িত থাকে তবে একটি জসন অনুসন্ধান ব্যবহারের জন্য একটি ভাল সরঞ্জাম হতে পারে।

অ্যাক্সেস করা সম্পত্তি যদি ইতিমধ্যে জানা থাকে তবে পথটি জটিল, উদাহরণস্বরূপ এই বস্তুটিতে

var obj = {
 arr: [
    { id: 1, name: "larry" },    
    { id: 2, name: "curly" },
    { id: 3, name: "moe" }
 ]
};

এবং আপনি জানেন যে আপনি অবজেক্টে অ্যারের প্রথম ফলাফল পেতে চান, সম্ভবত আপনি ব্যবহার করতে চান

var moe = obj["arr[0].name"];

তবে, সেই নামটি দিয়ে কোনও বস্তুর সম্পত্তি না থাকায় এটি একটি ব্যতিক্রম ঘটায়। এটি ব্যবহারে সক্ষম হবার সমাধানটি হ'ল বস্তুর গাছের দিকটি সমতল করা। এটি পুনরাবৃত্তভাবে করা যেতে পারে।

function flatten(obj){
 var root = {};
 (function tree(obj, index){
   var suffix = toString.call(obj) == "[object Array]" ? "]" : "";
   for(var key in obj){
    if(!obj.hasOwnProperty(key))continue;
    root[index+key+suffix] = obj[key];
    if( toString.call(obj[key]) == "[object Array]" )tree(obj[key],index+key+suffix+"[");
    if( toString.call(obj[key]) == "[object Object]" )tree(obj[key],index+key+suffix+".");   
   }
 })(obj,"");
 return root;
}

এখন, জটিল বস্তু সমতল করা যেতে পারে

var obj = previous definition;
var flat = flatten(obj);
var moe = flat["arr[0].name"];//moe

এখানে jsFiddle Demoএই পদ্ধতির একটি ব্যবহৃত হচ্ছে।


আপনি obj["arr[0].name"]পরিবর্তে ডাব্লুটিএইচ ব্যবহার করতে চান obj.arr[0].name? সিরিয়ালাইজেশন ব্যতীত আপনার চ্যাপ্টা জিনিসগুলি নিয়ে খুব কমই প্রয়োজন / প্রয়োজন ।
বার্গি

@ বার্গি - আমি এই প্রশ্নটি সাধারণত দেখতে পাচ্ছি এবং যেহেতু এটি সাধারণভাবে ব্যবহৃত হচ্ছে, তাই আমি এর সংস্করণটির একটি উত্তর পোস্ট করেছি। যদি এটি এড়াতে সক্ষম হয় তবে অবজেক্ট.আর [0]। নাম ব্যবহার করা আরও দ্রুত হয় তবে কখনও কখনও লোকেরা স্ট্রিং অ্যাকসেসরগুলি চারপাশে পাস করতে চায় এবং এটি এটি করার একটি উদাহরণ।
ট্র্যাভিস জে

Urgh। তবুও, কেবলমাত্র একটি একক স্ট্রিং পাথ ব্যবহার করার জন্য সম্পূর্ণ অবজেক্টকে সমতল করার পক্ষে খুব কমই কারণ রয়েছে, আপনি কেবল এটি পার্স করতে পারেন এবং একটি গতিশীল অনুসন্ধান করতে পারেন।
বার্গি

14

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

const data = {
  code: 42,
  items: [{
    id: 1,
    name: 'foo'
  }, {
    id: 2,
    name: 'bar'
  }]
};

const {
  items: [, {
    name: secondName
  }]
} = data;

console.log(secondName);

উপরোক্ত উদাহরণে একটি পরিবর্তনশীল নামক সৃষ্টি secondNameথেকে nameএকটি অ্যারের নামক কী items, নিঃসঙ্গ ,অ্যারের মধ্যে প্রথম বস্তুর লাফালাফি বলেছেন।

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

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


13

নেস্টেড অ্যাট্রিবিউট অ্যাক্সেস করতে আপনার নামটি নির্দিষ্ট করতে হবে এবং তারপরে অবজেক্টটির মাধ্যমে অনুসন্ধান করতে হবে।

আপনি যদি ইতিমধ্যে সঠিক পথটি জানেন তবে আপনার স্ক্রিপ্টে এটির মতো হার্ডকোড করতে পারেন:

data['items'][1]['name']

এগুলিও কাজ করে -

data.items[1].name
data['items'][1].name
data.items[1]['name']

আপনি যখন হাতের সঠিক নামটি জানেন না, বা কোনও ব্যবহারকারী হ'ল আপনার নামটি সরবরাহ করে। তারপরে গতিশীলভাবে ডেটা স্ট্রাকচারের মাধ্যমে অনুসন্ধান করা প্রয়োজন। কিছু এখানে পরামর্শ দিয়েছিল যে forলুপ ব্যবহার করে অনুসন্ধান করা যেতে পারে , তবে ব্যবহার করে কোনও পথ অতিক্রমের খুব সহজ উপায় রয়েছে Array.reduce

const data = { code: 42, items: [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }] }
const path = [ 'items', '1', 'name']
let result = path.reduce((a,v) => a[v], data)

পাথটি বলার উপায়: প্রথমে কীটি দিয়ে বস্তুটি নিয়ে যান items, যা অ্যারে হিসাবে ঘটে। তারপরে 1-st এলিমেন্টটি নিন (0 টি সূচক অ্যারে)। সর্বশেষে nameসেই অ্যারের উপাদানটির সাথে কীটি নিয়ে বস্তুটি নিয়ে যান , যা স্ট্রিং হয়ে থাকে bar

আপনার যদি খুব দীর্ঘ পথ থাকে তবে আপনি এগুলি আরও সহজ String.splitকরে তুলতে ব্যবহার করতে পারেন -

'items.1.name'.split('.').reduce((a,v) => a[v], data)

JQuery বা লড্যাশের মতো কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে এটি কেবল সাধারণ জাভাস্ক্রিপ্ট।


13
var ourStorage = {


"desk":    {
    "drawer": "stapler"
  },
"cabinet": {
    "top drawer": { 
      "folder1": "a file",
      "folder2": "secrets"
    },
    "bottom drawer": "soda"
  }
};
ourStorage.cabinet["top drawer"].folder2; // Outputs -> "secrets"

অথবা

//parent.subParent.subsubParent["almost there"]["final property"]

মূলত, প্রতিটি বংশধরের মধ্যে একটি বিন্দু ব্যবহার করুন যা এটির নীচে old অন্যথায়, একটি বিন্দু যথেষ্ট হবে;

উত্স: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-objects

এটি যুক্ত করতে, নেস্টেড অ্যারেগুলিতে অ্যাক্সেস করা এরকম হবে:

var ourPets = [
  {
    animalType: "cat",
    names: [
      "Meowzer",
      "Fluffy",
      "Kit-Cat"
    ]
  },
  {
    animalType: "dog",
    names: [
      "Spot",
      "Bowser",
      "Frankie"
    ]
  }
];
ourPets[0].names[1]; // Outputs "Fluffy"
ourPets[1].names[0]; // Outputs "Spot"

সূত্র: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays/

উপরের পরিস্থিতি চিত্রিত করার জন্য আরও একটি দরকারী দলিল: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics# ব্র্যাকেট_নোটেশন

ডট ওয়াকিংয়ের মাধ্যমে সম্পত্তি অ্যাক্সেস: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / প্রপার্টি_অ্যাকসেসরগুলি # ডট_নোটেশন


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

1
আমি পোস্টটি সম্পাদনা করেছি। যদিও লোকেরা এটিকে খারাপ প্রতিক্রিয়া জানাতে দ্রুত ছিল। পরের বার আমি উত্তর দেওয়া থেকে বিরত থাকব।
জনি 0

1
@ রিডিক বিরত থাকবেন না, কেবলমাত্র নিশ্চিত করুন যে আপনি কেবল একটি লিঙ্ক পোস্ট
করেননি

12

আপনি lodash _getফাংশন ব্যবহার করতে পারেন :

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

9

আপনি কোনও লাইব্রেরি অন্তর্ভুক্ত করতে ইচ্ছুক হলে জেএসএনপথ ব্যবহার করা সবচেয়ে নমনীয় সমাধানগুলির মধ্যে একটি হবে: https://github.com/s3u/JSONPath (নোড এবং ব্রাউজার)

আপনার ব্যবহারের ক্ষেত্রে জসন পথটি হ'ল:

$..items[1].name

তাই:

var secondName = jsonPath.eval(data, "$..items[1].name");

1
ইভাল () ব্যবহার করা ভাল সমাধান নয়। পরিবর্তে প্রথম শ্রেণির ফাংশন ব্যবহার করা যেতে পারে।
প্রদীপ গওদা

8

কেবলমাত্র, যে কেউ 2017 বা তার পরে এই প্রশ্নটি দেখেছেন এবং সহজে মনে রাখার সহজ উপায় খুঁজছেন, জাভাস্ক্রিপ্টে নেস্টেড অবজেক্টগুলিতে অ্যাক্সেস করার বিষয়ে একটি বিস্তৃত ব্লগ পোস্ট এখানে বাঁশ ছাড়াই

সংজ্ঞায়িত ত্রুটির সম্পত্তি 'ফু' পড়তে পারে না

1. অলিভার স্টিলের নেস্টেড অবজেক্ট অ্যাক্সেস প্যাটার্ন

অলিভার স্টিলের নেস্টেড অবজেক্ট অ্যাক্সেস প্যাটার্নটি ব্যবহার করা সবচেয়ে সহজ এবং পরিষ্কার উপায়

const name = ((user || {}).personalInfo || {}).name;

এই স্বরলিপি দিয়ে আপনি কখনই প্রবেশ করতে পারবেন না

সংজ্ঞায়িতের সম্পত্তি 'নাম' পড়তে পারে না

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

2. অ্যারে হ্রাস ব্যবহার করে নেস্টেড অবজেক্টগুলিতে অ্যাক্সেস করুন

নেস্টেড অ্যারে অ্যাক্সেস করতে সক্ষম হতে, আপনি নিজের অ্যারে হ্রাস ব্যবহার লিখতে পারেন।

const getNestedObject = (nestedObj, pathArr) => {
    return pathArr.reduce((obj, key) =>
        (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);
}

// pass in your object structure as array elements
const name = getNestedObject(user, ['personalInfo', 'name']);

// to access nested array, just pass in array index as an element the path array.
const city = getNestedObject(user, ['personalInfo', 'addresses', 0, 'city']);
// this will return the city from the first address item.

এখানে একটি দুর্দান্ত টাইপ হ্যান্ডলিং ন্যূনতম গ্রন্থাগার টাইপও রয়েছে যা আপনার পক্ষে এই সমস্ত কাজ করে।


3
এই প্রশ্নটি মূলত অ্যাক্সেস বৈশিষ্ট্য যা বিদ্যমান about আপনি যা উল্লেখ করছেন সে সম্পর্কে ইতিমধ্যে একটি প্রশ্ন রয়েছে (এবং ইতিমধ্যে আপনার বেশিরভাগ সমাধান অন্তর্ভুক্ত করেছেন): জাভাস্ক্রিপ্ট নেস্টেড বস্তুগুলি নিরাপদে অ্যাক্সেস করুন বা স্ট্রিং কী সহ নেস্টেড জাভাস্ক্রিপ্ট অবজেক্টগুলিতে অ্যাক্সেস করুন । তবে যাইহোক: "দুর্ভাগ্যক্রমে, আপনি এই কৌশল দ্বারা নেস্টেড অ্যারেগুলি অ্যাক্সেস করতে পারবেন না।" কেন না? অ্যারেগুলি অবজেক্টস, সুতরাং এটি ঠিক একইভাবে কাজ করা উচিত। আপনি যেমন একটি উদাহরণ প্রদান করতে পারেন যেখানে এটি না?
ফেলিক্স ক্লিং

1
@ ফেলিক্সক্লিং যখন আমরা অলিভার স্টিল প্যাটার্ন দিয়ে অ্যারেগুলি অ্যাক্সেস করার চেষ্টা করি তখন আমরা 'অপরিবর্তিত' ত্রুটি না পেয়ে উড়তে 'এন' দৈর্ঘ্যের অ্যারে তৈরি করতে এবং নবম সূচকে অ্যাক্সেস করতে সক্ষম হব না। যাত্রা। ((user || {}).address || new Array(3))[1].name
দিনেশ পান্ডিয়ান

3
আপনি আপনার প্যাটার্নটি ধারাবাহিকভাবে প্রয়োগ করছেন না। ...[1].barউপাদানটির 1অস্তিত্ব না থাকলে অবশ্যই কোনও ত্রুটি ঘটবে । তবে এটি ....foo.barযদি fooউপস্থিত না থাকে তার ক্ষেত্রেও । আপনি 1যেমন "অন্য কোনও সম্পত্তি অ্যাক্সেস" রক্ষা করতে চান ঠিক তেমনি "গার্ড" রাখতে হবে। একটি অ্যারে কেবল একটি বস্তু। একটি "অ্যারে উপাদান" কেবল একটি সম্পত্তি। সঠিকভাবে প্রয়োগ করা হবে (((user || {}).address || {})[1] || {}).name
ফেলিক্স ক্লিং

1
এটা অসাধারণ. এটি আমাকে এভাবে আঘাত করত না। @ ফেলিক্সক্লিংকে ধন্যবাদ, আমি ব্লগ পোস্টগুলি আপডেট করতে যাচ্ছি।
দিনেশ পান্ডিয়ান

2
@ দীনেশপান্দিয়ানের আপনাকে প্রকাশ করা উচিত যে আপনি টাইপের লেখক, আমি আপনার ব্লগ পোস্টটি পড়েই এখানে এসেছি
রেগেইগুইটার ২

8

আমি JQuery পছন্দ। এটি পরিষ্কার এবং সহজেই পড়া যায়।

$.each($.parseJSON(data), function (key, value) {
  alert(value.<propertyname>);
});

7

গতিশীলভাবে বহু স্তরের বস্তু অ্যাক্সেস করা।

var obj = {
  name: "john doe",
  subobj: {
    subsubobj: {
      names: "I am sub sub obj"
    }
  }
};

var level = "subobj.subsubobj.names";
level = level.split(".");

var currentObjState = obj;

for (var i = 0; i < level.length; i++) {
  currentObjState = currentObjState[level[i]];
}

console.log(currentObjState);

ওয়ার্ডিং ফিডল: https://jsfiddle.net/andreitodorut/3mws3kjL/


6

আপনি যদি এক বা একাধিক অবজেক্টের সন্ধান করেন যা নির্দিষ্ট মানদণ্ডের সাথে মেলে আপনার কাছে ক্যোয়ারী-জেএস ব্যবহার করে কয়েকটি বিকল্প রয়েছে

//will return all elements with an id larger than 1
data.items.where(function(e){return e.id > 1;});
//will return the first element with an id larger than 1
data.items.first(function(e){return e.id > 1;});
//will return the first element with an id larger than 1 
//or the second argument if non are found
data.items.first(function(e){return e.id > 1;},{id:-1,name:""});

এগুলির একটি singleএবং এগুলিও singleOrDefaultঅনেকগুলি যথাক্রমে firstএবং firstOrDefaultযথাক্রমে কাজ করে। শুধু পার্থক্য যে, তারা যদি নিক্ষেপ করবে আরো একাধিক মিল পাওয়া যায়।

ক্যোয়ারী-জেএসের আরও ব্যাখ্যার জন্য আপনি এই পোস্টটি দিয়ে শুরু করতে পারেন


আমি কীভাবে এটি উন্নত হতে পারে তা জানতে আগ্রহী। কোন মন্তব্য করতে যত্ন?
রুন এফএস

6

অ্যান্ডসোর জেএস ওয়ে

যা একটি জাভাস্ক্রিপ্ট লাইব্রেরি functional programmingযা কোনও বিল্ট-ইন অবজেক্টকে বাড়িয়ে না দিয়ে দরকারী সহায়কদের পুরো মেস সরবরাহ করে।

সমাধান:

var data = {
  code: 42,
  items: [{
    id: 1,
    name: 'foo'
  }, {
    id: 2,
    name: 'bar'
  }]
};

var item = _.findWhere(data.items, {
  id: 2
});
if (!_.isUndefined(item)) {
  console.log('NAME =>', item.name);
}

//using find - 

var item = _.find(data.items, function(item) {
  return item.id === 2;
});

if (!_.isUndefined(item)) {
  console.log('NAME =>', item.name);
}

6

পুরানো প্রশ্ন তবে লোডাস হিসাবে কেউ উল্লেখ করেনি (কেবল আন্ডারস্কোর)।

আপনি যদি ইতিমধ্যে আপনার প্রকল্পে লোডাশ ব্যবহার করছেন তবে আমি মনে করি এটি একটি জটিল উদাহরণে করার জন্য একটি মার্জিত উপায়:

অপ্ট 1

_.get(response, ['output', 'fund', 'data', '0', 'children', '0', 'group', 'myValue'], '')

একই রকম:

অপ্ট 2

response.output.fund.data[0].children[0].group.myValue

প্রথম এবং দ্বিতীয় বিকল্পের মধ্যে পার্থক্য হ'ল অপ্ট 1-এ যদি আপনার কোনও ত্রুটি না পায় এমন পথে কোনও সম্পত্তি (নিখুঁত) অনুপস্থিত থাকে তবে এটি আপনাকে তৃতীয় প্যারামিটার দেয় returns

অ্যারে ফিল্টারের জন্য লোডাশ রয়েছে _.find()তবে আমি নিয়মিত ব্যবহার করব filter()। তবে আমি এখনও মনে করি যে _.get()সত্যিই জটিল ডেটার সাথে কাজ করার সময় উপরের পদ্ধতিটি অত্যন্ত কার্যকর is আমি অতীতে জটিল জটিল এপিআইয়ের মুখোমুখি হয়েছিলাম এবং এটি কার্যকর ছিল!

আমি আশা করি যে শিরোনামটি বোঝায় যে সত্যিই জটিল ডেটা ম্যানিপুলেট করার জন্য বিকল্পগুলির সন্ধানের জন্য এটি কার্যকর হতে পারে।


5

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

var data = {
  code: 42,
  items: [{
    id: 1,
    name: 'aaa',
    items: [{
        id: 3,
        name: 'ccc'
      }, {
        id: 4,
        name: 'ddd'
      }]
    }, {
    id: 2,
    name: 'bbb',
    items: [{
        id: 5,
        name: 'eee'
      }, {
        id: 6,
        name: 'fff'
      }]
    }]
};

var jsonloop = new JSONLoop(data, 'id', 'items');

jsonloop.findNodeById(data, 5, function(err, node) {
  if (err) {
    document.write(err);
  } else {
    document.write(JSON.stringify(node, null, 2));
  }
});
<script src="https://rawgit.com/dabeng/JSON-Loop/master/JSONLoop.js"></script>


ভেরিয়েবলগুলি ব্যবহার করে আমি কীভাবে নেস্টেড জসন বস্তুকে অ্যাক্সেস করব। ডেটা = {এ: {বি: 'এসএস'}}; var কী = আব ডেটা [কী] কাজ করছে না
পাসুপতী রাজনীকীকম

3

jsonObject.keyমানটি অ্যাক্সেস করতে আপনি সিনট্যাক্সটি ব্যবহার করতে পারেন । এবং যদি আপনি কোনও অ্যারে থেকে কোনও মান অ্যাক্সেস করতে চান তবে আপনি সিনট্যাক্সটি ব্যবহার করতে পারেন jsonObjectArray[index].key

আপনাকে ধারণা দেওয়ার জন্য বিভিন্ন মান অ্যাক্সেস করার জন্য এখানে কোডের উদাহরণ রয়েছে।

        var data = {
            code: 42,
            items: [{
                id: 1,
                name: 'foo'
            }, {
                id: 2,
                name: 'bar'
            }]
        };

        // if you want 'bar'
        console.log(data.items[1].name);

        // if you want array of item names
        console.log(data.items.map(x => x.name));

        // get the id of the item where name = 'bar'
        console.log(data.items.filter(x => (x.name == "bar") ? x.id : null)[0].id);


3

গতিশীল পদ্ধতির

নীচের deep(data,key)ফাংশনে, আপনি স্বেচ্ছাচারিত keyস্ট্রিং ব্যবহার করতে পারেন - আপনার ক্ষেত্রে items[1].name(আপনি [i]যে কোনও স্তরের অ্যারে স্বরলিপি ব্যবহার করতে পারেন ) - কীটি যদি অবৈধ হয় তবে অপরিবর্তিত ফিরে আসা is


2

স্বেচ্ছাসেবী JSON গাছগুলি উদ্ঘাটন করার জন্য একটি অজগর, পুনরাবৃত্ত এবং কার্যকরী পদ্ধতির:

handlers = {
    list:  iterate,
    dict:  delve,
    str:   emit_li,
    float: emit_li,
}

def emit_li(stuff, strong=False):
    emission = '<li><strong>%s</strong></li>' if strong else '<li>%s</li>'
    print(emission % stuff)

def iterate(a_list):
    print('<ul>')
    map(unravel, a_list)
    print('</ul>')

def delve(a_dict):
    print('<ul>')
    for key, value in a_dict.items():
        emit_li(key, strong=True)
        unravel(value)
    print('</ul>')

def unravel(structure):
    h = handlers[type(structure)]
    return h(structure)

unravel(data)

যেখানে ডেটা একটি অজগর তালিকা (একটি JSON পাঠ্য স্ট্রিং থেকে পার্স করা):

data = [
    {'data': {'customKey1': 'customValue1',
           'customKey2': {'customSubKey1': {'customSubSubKey1': 'keyvalue'}}},
  'geometry': {'location': {'lat': 37.3860517, 'lng': -122.0838511},
               'viewport': {'northeast': {'lat': 37.4508789,
                                          'lng': -122.0446721},
                            'southwest': {'lat': 37.3567599,
                                          'lng': -122.1178619}}},
  'name': 'Mountain View',
  'scope': 'GOOGLE',
  'types': ['locality', 'political']}
]

6
এই প্রশ্নটি পাইথন নয়, জাভাস্ক্রিপ্ট সম্পর্কে। পাইথনের সমতুল্য প্রশ্ন আছে কিনা তা নিশ্চিত নয়।
ফেলিক্স ক্লিং

2

jQuery এর গ্রেপ ফাংশন আপনাকে একটি অ্যারের মাধ্যমে ফিল্টার করতে দেয়:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

$.grep(data.items, function(item) {
    if (item.id === 2) {
        console.log(item.id); //console id of item
        console.log(item.name); //console name of item
        console.log(item); //console item object
        return item; //returns item object
    }

});
// Object {id: 2, name: "bar"}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


2
// const path = 'info.value[0].item'
// const obj = { info: { value: [ { item: 'it works!' } ], randominfo: 3 }  }
// getValue(path, obj)

export const getValue = ( path , obj) => {
  const newPath = path.replace(/\]/g, "")
  const arrayPath = newPath.split(/[\[\.]+/) || newPath;

  const final = arrayPath.reduce( (obj, k) => obj ?  obj[k] : obj, obj)
  return final;
}

2

2020 এ, আপনি @ বাবেল / প্লাগইন-প্রস্তাব-alচ্ছিক-শৃঙ্খলা ব্যবহার করতে পারেন এটি কোনও অবজেক্টে নেস্টেড মানগুলি অ্যাক্সেস করা খুব সহজ।

 const obj = {
 foo: {
   bar: {
     baz: class {
   },
  },
 },
};

const baz = new obj?.foo?.bar?.baz(); // baz instance

const safe = new obj?.qux?.baz(); // undefined
const safe2 = new obj?.foo.bar.qux?.(); // undefined

https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining

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


-4

আমার stringdataপিএইচপি ফাইল থেকে আসছে কিন্তু এখনও, আমি এখানে ইঙ্গিত করছি var। আমি যখন আমার জসনকে সরাসরি objএটিতে নিয়ে যাই তখন আমার জেসন ফাইলটি কেন রাখি তা কিছুই দেখায় না

var obj=JSON.parse(stringdata); সুতরাং এর পরে আমি আপত্তি পেয়েছি messageএবং সতর্কতা বাক্সে প্রদর্শন করব তারপরে আমি dataযা পেয়েছি যা জসন অ্যারে এবং একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে ArrObjতারপর আমি সেই অ্যারের প্রথম অবজেক্টটি এর মতো মূল মান সহ পড়িArrObj[0].id

     var stringdata={
        "success": true,
        "message": "working",
        "data": [{
                  "id": 1,
                  "name": "foo"
         }]
      };

                var obj=JSON.parse(stringdata);
                var key = "message";
                alert(obj[key]);
                var keyobj = "data";
                var ArrObj =obj[keyobj];

                alert(ArrObj[0].id);

2
উদাহরণটি বিভ্রান্তিকর কারণ stringjsonকোনও স্ট্রিং নয়।
ফেলিক্স ক্লিং

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