Question Obtenir un objet JavaScript à partir d'un tableau d'objets en fonction de la valeur de la propriété [dupliquer]


Cette question a déjà une réponse ici:

Disons que j'ai un tableau de quatre objets:

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

Y at-il un moyen que je puisse obtenir le troisième objet ({a: 5, b: 6}) par la valeur de la propriété b par exemple sans for...in boucle?


477
2017-12-20 01:57


origine


Réponses:


Filter tableau d'objets, dont la propriété correspond à la valeur, renvoie le tableau:

var result = jsObjects.filter(obj => {
  return obj.b === 6
})

Voir le MDN Docs sur Array.prototype.filter ()

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

let result = jsObjects.filter(obj => {
  return obj.b === 6
})

console.log(result)

Find la valeur du premier élément / objet dans le tableau, sinon undefined est retourné.

var result = jsObjects.find(obj => {
  return obj.b === 6
})

Voir le MDN Docs sur Array.prototype.find ()

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

let result = jsObjects.find(obj => {
  return obj.b === 6
})

console.log(result)


637
2017-12-20 02:01



jsObjects.find(x => x.b === 6)

De MDN:

le find() La méthode renvoie une valeur dans le tableau, si un élément du tableau satisfait la fonction de test fournie. Autrement undefined est retourné.


Note de côté: des méthodes comme find() et les fonctions fléchées ne sont pas supportées par les anciens navigateurs (comme IE), donc si vous souhaitez prendre en charge ces navigateurs, vous devez les transposer en utilisant Babel.


183
2018-02-14 20:51



Je ne sais pas pourquoi vous êtes contre une boucle de for (probablement vous vouliez une boucle, pas spécifiquement pour ..), ils sont rapides et faciles à lire. Quoi qu'il en soit, voici quelques options.

Pour la boucle:

function getByValue(arr, value) {

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

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

.filtre

function getByValue2(arr, value) {

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

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

}

.pour chaque

function getByValue3(arr, value) {

  var result = [];

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

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

}

Si, par contre, vous avez vraiment voulu dire pour .. et que vous voulez trouver un objet avec n'importe quelle propriété avec une valeur de 6, vous devez utiliser for..in à moins que vous ne passiez les noms à vérifier. par exemple.

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

132
2017-12-20 02:58



Essayer Filtre à matrice méthode pour filtrer le array of objects avec property.

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

en utilisant la méthode de filtrage de tableaux:

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

utiliser pour en boucle:

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

Violon de travail:  https://jsfiddle.net/uq9n9g77/


27
2017-11-02 09:57



En utilisant underscore.js:

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

19
2017-10-16 18:15



Il semble que dans la proposition ECMAScript 6, il y a Array méthodes find() et findIndex(). MDN propose également des polyfills que vous pouvez inclure pour en obtenir les fonctionnalités sur tous les navigateurs.

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

16
2018-04-04 07:39



Si je comprends bien, vous voulez trouver l'objet dans le tableau dont b la propriété est 6?

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

Ou si vous utilisiez un underscore:

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

15
2017-12-20 02:03