জাভাস্ক্রিপ্টে অবজেক্টের অ্যারেতে কীভাবে একটি মান খুঁজে পাবেন?


91

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

Object = {
   1 : { name : bob , dinner : pizza },
   2 : { name : john , dinner : sushi },
   3 : { name : larry, dinner : hummus }
}

চাবিটি "রাতের খাবার" যেখানে রয়েছে তার জন্য আমি অবজেক্ট / অ্যারেটি অনুসন্ধান করতে সক্ষম হতে চাই এবং এটি "সুশির" সাথে মেলে কিনা see

আমি জানি jQuery এর in .inArray রয়েছে তবে এটি অবজেক্টের অ্যারেগুলিতে কাজ করছে বলে মনে হয় না। অথবা আমি ভুল হতে পারে। সূচিপত্রও মনে হয় কেবলমাত্র একটি অ্যারে স্তরে কাজ করবে।

এর জন্য কোনও কার্যকারিতা বা বিদ্যমান কোড নেই?


এটি আগে জিজ্ঞাসা করা হয়েছে। আপনাকে নিজের ফাংশন লিখতে হবে বা অন্য কোনও গ্রন্থাগার ব্যবহার করতে হবে।
ফেলিক্স ক্লিং

4
দয়া করে নোট করুন যে Objectজাভাস্ক্রিপ্টে সংরক্ষিত, Objectহ'ল অবজেক্ট অবজেক্ট, অর্থাৎ সমস্ত বস্তুর জননী।
অ্যাডামস

4
প্রশ্ন এবং স্বীকৃত উত্তরগুলি বহুমাত্রিক অ্যারে সম্পর্কিত নয় তবে এর আইটেমগুলির সম্পত্তি মান অনুসারে 1-মাত্রিক অ্যারে ফিল্টারিং। => তারা আমার সমস্যার সমাধান করেনি "বহুমাত্রিক অ্যারেতে একটি মান খুঁজে পাওয়া"।
মার্টিন স্নাইডার

উত্তর:


213

আপনার যদি অ্যারে থাকে যেমন

var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

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

people.filter(function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]

নতুন জাভাস্ক্রিপ্ট প্রয়োগে আপনি একটি ফাংশন এক্সপ্রেশন ব্যবহার করতে পারেন:

people.filter(p => p.dinner == "sushi")
  // => [{ "name": "john", "dinner": "sushi" }]

আপনি যারা "dinner": "sushi"ব্যবহার করেছেন তাদের সন্ধান করতে পারেনmap

people.map(function (person) {
  if (person.dinner == "sushi") {
    return person
  } else {
    return null
  }
}); // => [null, { "name": "john", "dinner": "sushi" }, null]

বা ক reduce

people.reduce(function (sushiPeople, person) {
  if (person.dinner == "sushi") {
    return sushiPeople.concat(person);
  } else {
    return sushiPeople
  }
}, []); // => [{ "name": "john", "dinner": "sushi" }]

আমি নিশ্চিত আপনি এটিকে স্বেচ্ছাচারিত কী এবং মানগুলিতে সাধারণীকরণ করতে সক্ষম!


7
কেবল মনে রাখবেন যে এই সমাধানগুলি ECMAScript 5 এর অংশ এবং IE8 তে সমর্থিত নয়। kangax.github.com/es5-compat-table আমি @ অ্যাডামসের উত্তরটিকে যতটা পছন্দ করি, অ্যালেক্সটি আরও "পুরানো ছিটে ব্রাউজার" বান্ধব। পারফরম্যান্স সম্পর্কে নিশ্চিত না।
ইজিকো

@ সালমানা - প্রশ্ন বা সমাধানটি jQuery কে বোঝায় না। জাভাস্ক্রিপ্ট ফিল্টার () ব্যবহার করা হয়েছে, jQuery- নির্দিষ্ট f। ফিল্টার () - টিউটোরিয়ালপয়েন্ট
জাভাস্ক্রিপ্ট

EasyCo দ্বারা উল্লিখিত হিসাবে, ফিল্টার ফাংশন আইই 8 তে সমর্থিত নয়। তবে এটি সহজে অ্যারে প্রোটোটাইপে যুক্ত হয় এবং এটি আপনার স্ক্রিপ্টগুলির শুরুতে কোনও ছোট ফাংশন সহ যে কোনও ব্রাউজারে ব্যবহারযোগ্য। এটি ফিল্টার ডকুমেন্টেশনে বর্ণিত হয়েছে । এটি ECMA-262 এ উল্লিখিত সঠিক ফাংশন দেয়, সুতরাং এটি আক্ষরিকভাবে একই জিনিস।
ডালিন

4
আমি সবেমাত্র একটি উত্তর যুক্ত করেছি যা jQuery এর grepপদ্ধতি ব্যবহার করে । আপনার উত্তরটি আপনি যা করছেন ঠিক তেমন ধারণা হিসাবে রোল করতে পারে তবে jQuery নির্ভরশীল এবং ছিটে-ব্রাউজার বান্ধব।
Zach Lysobey

আমার রিটার্ন ভেরিয়েবলের সাথে আমি কোনও রেফারেন্স ত্রুটি পেয়ে যাওয়ার কি কোনও কারণ আছে? আমি "x" "ফেরার শীর্ষ দুটি উত্তর চেষ্টা করেছিলাম এবং এটি বলে যে এটি অপরিবর্তিত রয়েছে ...
ইভান লালো

18

jQuery একটি অন্তর্নির্মিত পদ্ধতি রয়েছে jQuery.grepযা ES5 এর মতো কাজ করেfilter @ অ্যাডামসের উত্তর থেকে ফাংশনের সাথে এবং পুরানো ব্রাউজারগুলিতে সূক্ষ্মভাবে কাজ করা উচিত।

অ্যাডামসের উদাহরণ ব্যবহার করে:

var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

আপনি নিম্নলিখিত করতে পারেন

jQuery.grep(peoples, function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]

10
var getKeyByDinner = function(obj, dinner) {
    var returnKey = -1;

    $.each(obj, function(key, info) {
        if (info.dinner == dinner) {
           returnKey = key;
           return false; 
        };   
    });

    return returnKey;       

}

jsFizz

এতক্ষণ -1যে কোনও বৈধ কী নয়।


এটি প্রায় upvated, কিন্তু পোস্টে কোন ব্যাখ্যা ছিল।
মিকম্যাকুসা

10

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

Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }

আপনি এখন সহজেই এটিকে অ্যাক্সেস করতে পারবেন: Object['sushi']['name']

অথবা যদি বস্তুটি সত্যই এই সাধারণ (অবজেক্টের কেবল 'নাম') হয় তবে আপনি কেবল এটিতে পরিবর্তন করতে পারেন:

Obj = { 'pizza' : 'bob', 'sushi' : 'john' }

এবং তারপরে এটিকে অ্যাক্সেস করুন: Object['sushi']

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


4
আপনি উত্তরটি ভালোবাসেন তবে আমি সিনট্যাক্স নিয়ে সমস্যা পেয়েছি: আমার এইরকমভাবে কাজ করেছে: اعتراض = {"পিজা": {"নাম": "বব"}, "সুশি": {"নাম": "জন"}} সতর্কতা ( আপত্তি ['পিজ্জা'] ['নাম']); কিন্তু এখনো. ধন্যবাদ! আমি যা খুঁজছিলাম তা খুঁজে পেয়েছি! )
আলেেক্সেলা

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

3

আলাসকল লাইব্রেরির সাহায্যে আপনি অ্যারেটিতে অবজেক্টটি সন্ধান করতে পারেন :

var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" },
     { name : "larry", dinner : "hummus" } ];

var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]);

এই উদাহরণটি jsFizz এ চেষ্টা করুন ।


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

4
যদি বস্তুটি নিজেই কোনও এসকিউএল উত্স থেকে উদ্ভূত হয় তবে এই উত্তরটি খাঁটি প্রতিভা।
এডওয়ার্ডসফারফ

1

আপনি লুপের জন্য একটি সাধারণ ব্যবহার করতে পারেন:

for (prop in Obj){
    if (Obj[prop]['dinner'] === 'sushi'){

        // Do stuff with found object. E.g. put it into an array:
        arrFoo.push(Obj[prop]);
    }
}

নিম্নলিখিত ফিটল উদাহরণটি এমন সমস্ত বস্তু রাখে যা dinner:sushiঅ্যারেতে থাকে:

https://jsfiddle.net/3asvkLn6/1/


1

এখানে ইতিমধ্যে অনেক ভাল উত্তর রয়েছে তাই কেন আর একজন নয়, লোডাশ বা আন্ডারস্কোরের মতো লাইব্রেরি ব্যবহার করুন :)

obj = {
   1 : { name : 'bob' , dinner : 'pizza' },
   2 : { name : 'john' , dinner : 'sushi' },
   3 : { name : 'larry', dinner : 'hummus' }
}

_.where(obj, {dinner: 'pizza'})
>> [{"name":"bob","dinner":"pizza"}]

0

আমাকে প্রথম পাতার আইটেমের জন্য একটি নেস্টেড সাইটম্যাপ কাঠামোটি অনুসন্ধান করতে হয়েছিল যা প্রদত্ত পাথটিকে সফল করে তোলে। আমি নীচের কোডটি নিয়ে এসেছি মাত্র .map() .filter()এবং ব্যবহার করে .reduce। সর্বশেষ আইটেমটি পাওয়া গেছে যা পথে মেলে /c

var sitemap = {
  nodes: [
    {
      items: [{ path: "/a" }, { path: "/b" }]
    },
    {
      items: [{ path: "/c" }, { path: "/d" }]
    },
    {
      items: [{ path: "/c" }, { path: "/d" }]
    }
  ]
};

const item = sitemap.nodes
  .map(n => n.items.filter(i => i.path === "/c"))
  .reduce((last, now) => last.concat(now))
  .reduce((last, now) => now);

4n4904z07 সম্পাদনা করুন


0

আপনি যদি অনুসন্ধানের ক্রিয়াকলাপের মাধ্যমে কোনও নির্দিষ্ট অবজেক্ট সন্ধান করতে চান তবে এই জাতীয় কিছু চেষ্টা করুন:

    function findArray(value){

        let countLayer = dataLayer.length;
        for(var x = 0 ; x < countLayer ; x++){

            if(dataLayer[x].user){
                let newArr = dataLayer[x].user;
                let data = newArr[value];
                return data;
            }

        }

        return null;

    }

    findArray("id");

এটি একটি উদাহরণ বস্তু:

layerObj = {
    0: { gtm.start :1232542, event: "gtm.js"},
    1: { event: "gtm.dom", gtm.uniqueEventId: 52},
    2: { visitor id: "abcdef2345"},
    3: { user: { id: "29857239", verified: "Null", user_profile: "Personal", billing_subscription: "True", partners_user: "adobe"}
}

কোডটি পুনরাবৃত্তি হবে এবং "ব্যবহারকারী" অ্যারের সন্ধান করবে এবং আপনি যে বস্তুটি ভিতরে খুঁজছেন তা সন্ধান করবে।

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

আমার জন্য একটি কবজ মত কাজ!

আপনার উদাহরণে এটি কিছুটা খাটো:

function findArray(value){

    let countLayer = Object.length;
    for(var x = 0 ; x < countLayer ; x++){

        if(Object[x].dinner === value){
            return Object[x];
        }

    }

    return null;

}

findArray('sushi');

0

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

const objectScan = require('object-scan');

const findDinner = (dinner, data) => objectScan(['*'], {
  abort: true,
  rtn: 'value',
  filterFn: ({ value }) => value.dinner === dinner
})(data);

const data = {
  1: { name: 'bob', dinner: 'pizza' },
  2: { name: 'john', dinner: 'sushi' },
  3: { name: 'larry', dinner: 'hummus' }
};

console.log(findDinner('sushi', data));
// => { name: 'john', dinner: 'sushi' }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.