जावास्क्रिप्ट में वस्तुओं की एक सरणी में एक मूल्य कैसे खोजें?


91

मेरे पास वस्तुओं की एक सरणी है:

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

मैं उस वस्तु / सरणी को खोजना चाहता हूं जहां कुंजी "डिनर" है, और देखें कि क्या यह "सुशी" से मेल खाता है।

मुझे पता है कि jQuery के पास $ .inArray है, लेकिन यह वस्तुओं के सरणियों पर काम नहीं करता है। या शायद मैं गलत हूं। indexOf भी केवल एक सरणी स्तर पर काम करने लगता है।

क्या इसके लिए कोई फ़ंक्शन या मौजूदा कोड नहीं है?


यह पहले पूछा गया है। आपको अपना स्वयं का फ़ंक्शन लिखना होगा या किसी अन्य पुस्तकालय का उपयोग करना होगा।
फेलिक्स क्लिंग

1
कृपया ध्यान दें कि Objectजो जावास्क्रिप्ट में आरक्षित है, Objectवह ऑब्जेक्ट ऑब्जेक्ट है, अर्थात सभी वस्तुओं की माँ।
निहारें

1
प्रश्न और स्वीकार किए गए उत्तर बहुआयामी सरणियों से संबंधित नहीं हैं, लेकिन 1-आयामी सरणी के लिए इसके आइटम के संपत्ति मानों से फ़िल्टरिंग है। => उन्होंने मेरी समस्या का समाधान नहीं किया "एक बहुआयामी सरणी में एक मूल्य खोजने"।
मार्टिन श्नाइडर

जवाबों:


212

यदि आपके पास एक सरणी है जैसे कि

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"a का उपयोग है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 जितना मैं @ एडामसेज़ का जवाब पसंद करता हूं, एलेक्स का "पुराने शिट्टी ब्राउज़र" के अनुकूल है। हालांकि प्रदर्शन के बारे में निश्चित नहीं है।
इजीको सेप

@SalmanA - और न ही सवाल या समाधान jQuery का जिक्र है। जावास्क्रिप्ट फ़िल्टर () का उपयोग किया जाता है, न कि jQuery- विशिष्ट $ .filter () - tutorialspoint.com/javascript/array_filter.htm
Tapirboy

जैसा कि ईज़ीको द्वारा उल्लेख किया गया है, फिल्टर फ़ंक्शन IE8 में समर्थित नहीं है। हालाँकि, यह आसानी से ऐरे प्रोटोटाइप में जोड़ा जाता है और इस प्रकार आपकी स्क्रिप्ट की शुरुआत में एक छोटे से फ़ंक्शन के साथ किसी भी ब्राउज़र में प्रयोग करने योग्य होता है। यह फ़िल्टर प्रलेखन में उल्लिखित है । यह ECMA-262 में निर्दिष्ट सटीक फ़ंक्शन देता है, इसलिए यह सचमुच एक ही बात है।
डैलिन

1
मैंने अभी एक उत्तर जोड़ा है जो jQuery की grepविधि का उपयोग करता है । अपने उत्तर को अपनी अवधारणा में रोल करने के लिए समझ में आ सकता है कि आप क्या कर रहे हैं, लेकिन jQuery पर निर्भर और shitty- ब्राउज़र के अनुकूल।
Zach Lysobey

क्या कोई कारण है जो मुझे अपने रिटर्न वैरिएबल के साथ एक संदर्भ त्रुटि मिलती रहती है? मैंने "x '' लौटाने वाले शीर्ष दो उत्तरों की कोशिश की और यह कहता रहता है कि यह अपरिभाषित है ...
इवान लालो

18

jQuery में एक अंतर्निहित पद्धति है jQuery.grepजो @ adamse के उत्तरfilter से ES5 फ़ंक्शन के समान काम करती है और पुराने ब्राउज़र पर ठीक काम करना चाहिए।

एडम्स के उदाहरण का उपयोग करना:

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;       

}

jsFiddle

जब तक -1कभी भी एक वैध कुंजी नहीं है।


लगभग इस एक को उखाड़ फेंका, लेकिन पोस्ट में कोई स्पष्टीकरण नहीं था।
मिकमैकुसा

10

यदि आप इस खोज को अक्सर करने जा रहे हैं, तो अपनी वस्तु के प्रारूप को बदलने पर विचार करें ताकि वास्तव में रात का खाना एक कुंजी हो। यह एक डेटाबेस तालिका में एक प्राथमिक संकुल कुंजी निर्दिष्ट करने की तरह है। इसलिए, उदाहरण के लिए:

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

अब आप इसे इस तरह आसानी से एक्सेस कर सकते हैं: Object['sushi']['name']

या यदि वस्तु वास्तव में यह सरल (वस्तु में सिर्फ 'नाम') है, तो आप इसे केवल इसमें बदल सकते हैं:

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

और फिर जैसे इसे उपयोग: Object['sushi']

यह स्पष्ट रूप से हमेशा संभव नहीं है या आपके डेटा ऑब्जेक्ट को इस तरह से पुनर्गठन करने के लिए आपके लाभ के लिए है, लेकिन बिंदु यह है कि कभी-कभी सबसे अच्छा उत्तर यह विचार करना है कि क्या आपके डेटा ऑब्जेक्ट का सबसे अच्छा तरीका संरचित है। इस तरह एक कुंजी बनाना तेजी से हो सकता है और क्लीनर कोड बना सकता है।


1
लव यू जवाब, लेकिन मुझे सिंटैक्स के साथ समस्या मिली: खदान ने केवल इस तरह काम किया: ओब्ज = {"पिज्जा": {"नाम": "बॉब"}, "सुशी": {"नाम": "जॉन"}} अलर्ट ( obj [ 'पिज़्ज़ा'] [ 'नाम']); फिर भी। धन्यवाद! मैं क्या खोज रहा था पाया! )
aleXela

@alexela धन्यवाद एलेक्सला! मैंने आपके उत्तर का अवलोकन आपके सूक्ष्म अवलोकन से किया! मैंने ओपी के पद में सिर्फ उदाहरण की नकल की थी और उद्धरण जोड़ने के लिए उपेक्षित किया था, लेकिन आप सही हैं - यह तब तक काम नहीं करेगा जब तक कि कम से कम मूल्यों के आसपास उद्धरण न हों (यह मानते हुए कि वे मूल्य हैं और चर नहीं हैं)।
dallin

3

आप ऑब्जेक्ट को Alasql लाइब्रेरी के साथ पा सकते हैं :

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

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

इस उदाहरण को jsFiddle में आज़माएं


3
मुझे यकीन नहीं है कि यह वास्तव में नीचे मतदान के योग्य है। संग्रह पर प्रश्नों की तरह Sql कारण और लिखना बहुत आसान हो जाता है जब आवश्यकताएं एक फिल्टर या कॉल को कम करने से अधिक जटिल हो जाती हैं। Alasql एक बहुत ही प्रभावशाली पुस्तकालय है, लेकिन ऊपर दिए गए उदाहरण के लिए यह एक छोटे से ओवरकिल है।
टॉमडॉटॉम जूल

1
यदि ऑब्जेक्ट स्वयं SQL स्रोत से उत्पन्न हुआ है, तो यह उत्तर शुद्ध प्रतिभा है।
एडवर्ड्समार्क

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"}
}

कोड पुनरावृति करेगा और "उपयोगकर्ता" सरणी ढूंढेगा और उस ऑब्जेक्ट को खोजेगा जिसे आप अंदर चाहते हैं।

मेरी समस्या तब थी जब एरे इंडेक्स ने हर विंडो रिफ्रेश को बदल दिया और यह 3 या दूसरे एरे में थी, लेकिन इससे कोई फर्क नहीं पड़ता।

मेरे लिए एक जादू की तरह काम किया!

आपके उदाहरण में यह थोड़ा छोटा है:

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' }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.