J'ai un tableau objArray. Je veux créer une fonction pour qu'elle vérifie s'il existe un autre objet avec la même clé name. S'il existe, il ajoutera +1 dans la clé qty. Si l'objet n'existe pas, il poussera le nouvel objet dans le tableau.

var objArray = [
  {"name":"bike","color":"blue","qty":2},
  {"name":"boat","color":"pink", "qty":1},
];

var carObj = {"name":"car","color":"red","qty":1};
var bikeObj = {"name":"bike","color":"blue","qty":1};
  
function checkAndAdd (obj) {
    for (var i = 0; i < objArray.length; i++) {
      if (objArray[i].name === obj.name) {
          objArray[i].qty++;
          break;
      }
      else {
          objArray.push(obj);
      }
    };
}

checkAndAdd(carObj);

console.log(objArray);

checkAndAdd(bikeObj);

console.log(objArray);

Après checkAndAdd(carObj);

console.log(objArray);

Devrait donner

[
  {"name":"car","color":"red", "qty":1},
  {"name":"bike","color":"blue","qty":2},
  {"name":"boat","color":"pink", "qty":1},
]

Et après checkAndAdd(bikeObj);

console.log(objArray);

Devrait donner

[
  {"name":"car","color":"red", "qty":1},
  {"name":"bike","color":"blue","qty":3},
  {"name":"boat","color":"pink", "qty":1},
]

Merci d'avance!

3
Joe82 11 avril 2018 à 20:13

5 réponses

Meilleure réponse

Vous devez vérifier tous les objets et quitter la fonction si un article est trouvé pour incrémenter la quantité.

S'il n'est pas trouvé, poussez l'objet.

var objArray = [{ name: "bike", color: "blue", qty: 2 }, { name: "boat", color: "pink", qty: 1 }],
    carObj = { name: "car", color: "red", qty: 1 },
    bikeObj = { name: "bike", color: "blue", qty: 1 };
  
function checkAndAdd (obj) {
    for (var i = 0; i < objArray.length; i++) {
        if (objArray[i].name === obj.name) {
            objArray[i].qty++;
            return;                             // exit loop and function
        }
    }
    objArray.push(obj);
}

checkAndAdd(carObj);
console.log(objArray);

checkAndAdd(bikeObj);
console.log(objArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
3
Nina Scholz 11 avril 2018 à 17:18

Assez simple:

function checkAndAdd(obj) {
for (var i=0; i < objArray.length; i++) {
    if (objArray[i]name === obj.name) {
        objArray[i].qty++;
        return
    }
}
objArray.push(obj)
}

Explication:

Votre fonction poussait à chaque fois que le nom de l'objet ne correspondait pas. Au lieu de cela, lorsque cette fonction a un nom correspondant, elle incrémente le qty et s'arrête, puis si les boucles se terminent sans aucune correspondance, elle pousse le obj.

1
D. Pardal 11 avril 2018 à 17:28

Utilisez findIndex pour trouver dans objArray si l'objet existe. S'il le met à jour, sinon, poussez le nouvel objet

var objArray = [{
    "name": "bike",
    "color": "blue",
    "qty": 2
  },
  {
    "name": "boat",
    "color": "pink",
    "qty": 1
  },
];

var carObj = {
  "name": "car",
  "color": "red",
  "qty": 1
};
var bikeObj = {
  "name": "bike",
  "color": "blue",
  "qty": 1
};

function checkAndAdd(obj) {
  var x = objArray.findIndex(function(item) {
    return item.name === obj.name;

  });
  if (x === -1) {
    objArray.push(obj)
  } else {
    objArray[x].qty = objArray[x].qty + obj.qty
  }
}

checkAndAdd(carObj);
checkAndAdd(bikeObj);
console.log(objArray);
1
brk 11 avril 2018 à 17:22

Vous pouvez également utiliser find pour rechercher la propriété d'objet.

L'utilisation de Object.assign avant de pousser l'objet clone l'objet et ne modifie pas l'objet d'origine lorsque vous modifiez le qty (si vous ajoutez d'autres objets portant le même nom.)

var objArray = [
    {"name":"bike","color":"blue","qty":2},
    {"name":"boat","color":"pink", "qty":1},
];

var carObj = {"name":"car","color":"red","qty":1};
var bikeObj = {"name":"bike","color":"blue","qty":1};

function checkAndAdd(obj) {
  let o = objArray.find(o => o.name === obj.name);  //Find if name exist

  if (!o) objArray.push(Object.assign({},obj));     //If not exist, push. 
  else o.qty += obj.qty;                            //If exist, add the qty
}

checkAndAdd(carObj);
console.log(objArray);

checkAndAdd(bikeObj);
console.log(objArray);
3
Eddie 11 avril 2018 à 17:27

Le problème est que vous push() entrez dans la boucle, au lieu de retourner immédiatement une fois trouvé et d'appeler uniquement push() en dehors de la boucle.

Une approche plus propre serait:

function checkAndAdd(obj) {
    var matchingObj = objArray.find(o => o.name === obj.name);

    if (matchingObj)
        matchingObj.qty++;
    else
        objArray.push(obj);
}
2
haim770 11 avril 2018 à 17:22