javascript - संपत्ति के मूल्य से वस्तुओं की सरणी से जावास्क्रिप्ट ऑब्जेक्ट प्राप्त करें



arrays (12)

इस प्रश्न का उत्तर यहां दिया गया है:

मान लें कि मेरे पास चार ऑब्जेक्ट्स हैं:

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

क्या कोई तरीका है कि मैं संपत्ति b के मूल्य से तीसरी वस्तु ( {a: 5, b: 6} ) प्राप्त कर सकता हूं उदाहरण के for...in लूप में?


Underscore.js का उपयोग करना:

var foundObject = _.findWhere(jsObjects, {b: 6});

अगर मैं सही ढंग से समझता हूं, तो आप ऑब्जेक्ट को उस सरणी में ढूंढना चाहते हैं जिसकी b संपत्ति 6 ?

var found;
jsObjects.some(function (obj) {
  if (obj.b === 6) {
    found = obj;
    return true;
  }
});

या यदि आप अंडरस्कोर का उपयोग कर रहे थे:

var found = _.select(jsObjects, function (obj) {
  return obj.b === 6;
});


आप इसे तीर फ़ंक्शन के साथ-साथ नीचे जैसा भी उपयोग कर सकते हैं:

var demoArray = [
   {name: 'apples', quantity: 2},
   {name: 'bananas', quantity: 0},
   {name: 'cherries', quantity: 5}
];

var result = demoArray.filter( obj => obj.name === 'apples')[0];
console.log(result);
// {name: 'apples', quantity: 2}

एक विशिष्ट संपत्ति मूल्य द्वारा वस्तुओं की सरणी से पहली वस्तु प्राप्त करने के लिए:

function getObjectFromObjectsArrayByPropertyValue(objectsArray, propertyName, propertyValue) {
  return objectsArray.find(function (objectsArrayElement) {
    return objectsArrayElement[propertyName] == propertyValue;
  });
}

function findObject () {
  var arrayOfObjectsString = document.getElementById("arrayOfObjects").value,
      arrayOfObjects,
      propertyName = document.getElementById("propertyName").value,
      propertyValue = document.getElementById("propertyValue").value,
      preview = document.getElementById("preview"),
      searchingObject;
  
  arrayOfObjects = JSON.parse(arrayOfObjectsString);
  
  console.debug(arrayOfObjects);
  
  if(arrayOfObjects && propertyName && propertyValue) {
    searchingObject = getObjectFromObjectsArrayByPropertyValue(arrayOfObjects, propertyName, propertyValue);
    if(searchingObject) {
      preview.innerHTML = JSON.stringify(searchingObject, false, 2);
    } else {
      preview.innerHTML = "there is no object with property " + propertyName + " = " + propertyValue + " in your array of objects";
    }
  }
}
pre {
  padding: 5px;
  border-radius: 4px;
  background: #f3f2f2;
}

textarea, button {
  width: 100%
}
<fieldset>
  <legend>Input Data:</legend>
  <label>Put here your array of objects</label>
  <textarea rows="7" id="arrayOfObjects">
  [
    {"a": 1, "b": 2},
    {"a": 3, "b": 4},
    {"a": 5, "b": 6},
    {"a": 7, "b": 8, "c": 157}
  ]
  </textarea>

  <hr>

  <label>property name: </label> <input type="text" id="propertyName"  value="b"/>
  <label>property value: </label> <input type="text" id="propertyValue" value=6 />
     
</fieldset>
<hr>
<button onclick="findObject()">find object in array!</button>
<hr>
<fieldset>
  <legend>Searching Result:</legend>
  <pre id="preview">click find</pre>
</fieldset>


ऐसा लगता है कि ईसीएमएस्क्रिप्ट 6 प्रस्ताव में Array विधियों को find() और findIndex() । एमडीएन पॉलीफिल भी प्रदान करता है जिसे आप सभी ब्राउज़रों में इनकी कार्यक्षमता प्राप्त करने के लिए शामिल कर सकते हैं।

find() :

function isPrime(element, index, array) {
    var start = 2;
    while (start <= Math.sqrt(element)) {
        if (element % start++ < 1) return false;
    }
    return (element > 1);
}

console.log( [4, 6, 8, 12].find(isPrime) ); // undefined, not found
console.log( [4, 5, 8, 12].find(isPrime) ); // 5

findIndex() :

function isPrime(element, index, array) {
    var start = 2;
    while (start <= Math.sqrt(element)) {
        if (element % start++ < 1) return false;
    }
    return (element > 1);
}

console.log( [4, 6, 8, 12].findIndex(isPrime) ); // -1, not found
console.log( [4, 6, 7, 12].findIndex(isPrime) ); // 2

कॉलबैक फ़ंक्शन पर विशिष्ट कुंजी मानों को पारित करने के लिए बाध्य के साथ ढूंढना।

   function byValue(o) { 
       return o.a === this.a && o.b === this.b; 
   };   

   var result = jsObjects.find(byValue.bind({ a: 5, b: 6 }));

मुझे नहीं पता कि आप लूप के खिलाफ क्यों हैं (संभवतः आप लूप के लिए हैं, विशेष रूप से for..in के लिए नहीं), वे तेज़ और पढ़ने में आसान हैं। किसी भी तरह, यहां कुछ विकल्प हैं।

पाश के लिए:

function getByValue(arr, value) {

  for (var i=0, iLen=arr.length; i<iLen; i++) {

    if (arr[i].b == value) return arr[i];
  }
}

.filter

function getByValue2(arr, value) {

  var result  = arr.filter(function(o){return o.b == value;} );

  return result? result[0] : null; // or undefined

}

।प्रत्येक के लिए

function getByValue3(arr, value) {

  var result = [];

  arr.forEach(function(o){if (o.b == value) result.push(o);} );

  return result? result[0] : null; // or undefined

}

यदि, दूसरी तरफ आप वास्तव में..in के लिए मतलब रखते हैं और 6 के मूल्य के साथ किसी भी संपत्ति के साथ कोई ऑब्जेक्ट खोजना चाहते हैं, तो आपको तब तक ..in का उपयोग करना चाहिए जब तक आप नामों को जांचने के लिए पास नहीं करते। जैसे

function getByValue4(arr, value) {
  var o;

  for (var i=0, iLen=arr.length; i<iLen; i++) {
    o = arr[i];

    for (var p in o) {
      if (o.hasOwnProperty(p) && o[p] == value) {
        return o;
      }
    }
  }
}

property साथ array of objects सरणी फ़िल्टर करने के लिए ऐरे फ़िल्टर विधि का प्रयास करें।

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

सरणी फ़िल्टर विधि का उपयोग कर:

var filterObj = jsObjects.filter(function(e) {
  return e.b == 6;
});

लूप में उपयोग करना:

for (var i in jsObjects) {
  if (jsObjects[i].b == 6) {
    console.log(jsObjects[i]); // {a: 5, b: 6}
  }
}

कामकाजी पहेली: https://jsfiddle.net/uq9n9g77/


ठीक है, ऐसा करने के कुछ तरीके हैं, लेकिन चलिए इसे करने के लिए सबसे सरल और नवीनतम दृष्टिकोण से शुरू करते हैं, इस फ़ंक्शन को find()

बस जब भी आप IE11 का समर्थन नहीं करते हैं तो इसका सावधानी बरतें, इसलिए इसे पारदर्शी करने की आवश्यकता है ...

तो आपके पास यह ऑब्जेक्ट है जैसा आपने कहा था:

var jsObjects = [
   {a: 1, b: 2}, 
   {a: 3, b: 4}, 
   {a: 5, b: 6}, 
   {a: 7, b: 8}
];

और आप एक समारोह लिख सकते हैं और इसे इस तरह प्राप्त कर सकते हैं:

function filterValue(obj, key, value) {
  return obj.find(function(v){ return v[key] === value});
}

और इस तरह के फ़ंक्शन का उपयोग करें:

filterValue(jsObjects, "b", 6); //{a: 5, b: 6}

ईएस 6 में भी संक्षिप्त संस्करण के लिए:

const filterValue = (obj, key, value)=> obj.find(v => v[key] === value);

यह विधि केवल पहला मान देता है जो मेल खाता है ..., बेहतर परिणाम और ब्राउज़र समर्थन के लिए, आप filter उपयोग कर सकते हैं:

const filterValue = (obj, key, value)=> obj.filter(v => v[key] === value);

और हम वापस आ जाएंगे [{a: 5, b: 6}] ...

यह विधि इसके बजाय एक सरणी वापस कर देगा ...

आप लूप के लिए भी सरल उपयोग करते हैं, इस तरह एक फ़ंक्शन बनाएं:

function filteredArray(arr, key, value) {
  const newArray = [];
  for(i=0, l=arr.length; i<l; i++) {
    if(arr[i][key] === value) {
      newArray.push(arr[i]);
    }
  }
 return newArray;
}

और इसे इस तरह कहते हैं:

filteredArray(jsObjects, "b", 6); //[{a: 5, b: 6}]

var jsObjects = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8}];

तीसरे ऑब्जेक्ट तक पहुंचने के लिए, jsObjects[2]; उपयोग करें jsObjects[2];
तीसरे ऑब्जेक्ट बी मान तक पहुंचने के लिए, jsObjects[2].b;







arrays