J'ai un tableau importé via AJAX. Je veux créer un nouveau tableau basé sur celui d'origine et parcourir le tout nouveau tableau afin de nettoyer la valeur QUELLE QUE soit la clé qui lui est associée.

L'ensemble de données importé ressemble à ceci:

[
    {id:"1", color:"red_blue", height:"100_200" },
    {id:"2", color:"green", height:"100_20" },
    {id:"3", color:"orange_yellow", height:"50" }
]

Et le processus jQuery ressemble à ceci

dataSet = JSON.parse(response);

// create a new array based on the imported array
var row = 0;

$.each(dataSet, function(key, value) {
    cleanDataSet.push(dataSet[row]);
    row++;
});

// clean the new array
var row = 0;

// Go through each row of the array
$.each(cleanDataSet, function(key, value) {

    // Go through each key and value of this array
    $.each(cleanDataSet[row], function(key, value) {
        var myVariable = thisValueWhateverTheKey.split('_');

        // if a split is detected in the value
        if (myVariable[1]) {
            // Update the value 
            thisValueWhateverTheKey = myVariable[0];
        }
        row++;
    });
});

console.log(cleanDataSet)

La partie "thisValueWhateverTheKey" est évidemment celle que je n'arrive pas à comprendre. C'est facile quand je cible les valeurs d'une clé spécifique (j'utiliserais "value.nameofmykey" mais pas tant que ça quand je cible une valeur d'une clé. "Valeur" seule ne fonctionnera pas.

1
Bachir Messaouri 7 avril 2020 à 21:03

4 réponses

Meilleure réponse

Vous pouvez utiliser value directement, très probablement vous vous trompez en utilisant key, value dans les deux boucles. Notez également que vous divisez le double soulignement __, qui doit être unique _ selon vos données.

Voici comment vous pouvez simplifier:

$.each(cleanDataSet, function(index, cleanDataSetRow){  

   // Go through each key and value of this array

    $.each(cleanDataSetRow, function(key, value){ 

        var myVariable = value.split('_');

        // if a split is detected in the value

        if(myVariable[1]){

            // Update the value 
            cleanDataSetRow[key] = myVariable[0];

        }

    });
});
1
Anurag Srivastava 7 avril 2020 à 18:35
const data = [
  {
    id: "1",
    color: "red_blue",
    height: "100_200"
  },
  {
    id: "2",
    color: "green",
    height: "100_20"
  },
  {
    id: "3",
    color: "orange_yellow",
    height: "50"
  }
];

var clean = data.map(item => Object.fromEntries(
  Object.keys(item).map(key => [key, item[key].split('_')[0]])
));

console.log(clean);
1
Misir Jafarov 7 avril 2020 à 18:43

Lorsque vous parcourez chaque objet, utilisez Object.entries() et détruisez chaque entrée (ex. [key, value]):

...
Object.entries(obj).forEach(([key, val]) => {
  if (val === value) {
    obj[key] = ''
  }
... 
let data = [
    {id:"1", color:"red_blue", height:"100_200" },
    {id:"2", color:"green", height:"100_20" },
    {id:"3", color:"orange_yellow", height:"50" }
];

function removeValue(objectArray, value) {
  objectArray.forEach(obj => {
    Object.entries(obj).forEach(([key, val]) => {
      if (val === value) {
        obj[key] = '';
      }
    });
  });
  return objectArray;
}

console.log(removeValue(data, "100_20"));
console.log(removeValue(data, "orange_yellow"));
0
zer00ne 7 avril 2020 à 18:43

Je pense que votre code / question est un peu déroutant - si je comprends bien, vous voulez quelque chose comme ça. Notez que la fonction map crée un nouveau tableau rempli avec les résultats de l'appel d'une fonction fournie sur chaque élément du tableau appelant. par exemple.

const data = [{
    id: "1",
    color: "red_blue",
    height: "100_200"
  },
  {
    id: "2",
    color: "green",
    height: "100_20"
  },
  {
    id: "3",
    color: "orange_yellow",
    height: "50"
  }
]

const clean = data.map(x => {
  // x is each object in the original array
  // i.e. data[0], data[1], etc
  for (y in x) {
   // y is each property in the object 
   // e.g. data[0]["id"], data[0]["color"], etc
   // so here we are setting the value of each property of each object
   x[y] = x[y].split('_')[0]
  }

  // finally return each modified object
  return x;
})

// so clean is a new array based on data
// where each property has been set to the correct value
console.log(clean)

Si ce n'est pas correct, pourriez-vous éventuellement modifier votre question pour l'inclure et un exemple de la façon dont vous souhaitez que les données se présentent - c'est-à-dire avant / après.

1
Fraser 7 avril 2020 à 19:44