Je veux parcourir les objets dans un tableau avec des clés différentes, sans utiliser de boucle pour chaque:

   [ { id: 1,
    ip: 'xx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' },
  { id: 2,
    ip: 'xxx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' },
  { id: 4,
    ip: 'xxx.xxx.xx.xxx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' } ]

Je veux vérifier chaque colonne mn pour une valeur de longueur puis la mettre à jour avec quelques informations, je peux simplement le faire si une autre condition, mais je pense qu'il existe une meilleure façon de le faire. J'ai essayé d'utiliser Object.entries puis pour la boucle, mais cela ne fonctionnera pas à cause des colonnes id et ip.

1
The pyramid 20 nov. 2018 à 22:23

3 réponses

Meilleure réponse

Peut-être que quelque chose comme ça fonctionnerait pour vous? Cette solution adopte une approche fonctionnelle de votre problème et évite l'utilisation explicite de la construction for-loop:

var input = [ { id: 1,
    ip: 'xx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' },
  { id: 2,
    ip: 'xxx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' },
  { id: 4,
    ip: 'xxx.xxx.xx.xxx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: '' } ];
    
var output = input.map(object => {
  
  return Object.entries(object).reduce((result, entry) => {
    
    let key = entry[0];
    let value = entry[1];
    
    if(key.startsWith('mn')) {
      
     value = `updated value for ${ key }`;
    }    
    
    result[key] = value;
    return result;
    
  }, {});
});

console.log(output);
2
Dacre Denny 20 nov. 2018 à 19:36

Vous pouvez utiliser Object.entries, Array.prototype.filter et Array.prototype.forEach à votre avantage.

const transform = value => `transformed-${value}`;
const arr = [{ id: "id", ip: "ip", otherKey: "other" }];
arr.forEach(obj => {
    Object.entries(obj)
        .filter(([key]) => key !== "id" && key !== "ip")
        .forEach(([key, value]) => (obj[key] = transform(value)));
});
console.log(arr)

Cela commence à être détaillé si vous ne pouvez pas utiliser les dernières fonctionnalités ECMAScript, cependant:

var transform = function(value) { return "transformed-" + value };
var arr = [{ id: "id", ip: "ip", otherKey: "other" }];
arr.forEach(function(obj) {
    Object.entries(obj)
        .filter(function(keyValue) {
            var key = keyValue[0];
            return key !== "id" && key !== "ip";
        })
        .forEach(function(keyValue) {
            var key = keyValue[0],
                value = keyValue[1];
            obj[key] = transform(value);
        });
});
console.log(arr)

Si vous êtes bloqué sur un projet sans Babel, votre meilleur pari pourrait être votre suggestion originale.

var transform = function(value) { return "transformed-" + value };
var arr = [{ id: "id", ip: "ip", otherKey: "other" }];
arr.forEach(function(obj) {
    Object.entries(obj).forEach(function(keyValue) {
        var key = keyValue[0],
            value = keyValue[1];
        if (key !== "id" && key !== "ip") {
            obj[key] = transform(value);
        }
    });
});
console.log(arr)
1
Michael Hines 20 nov. 2018 à 19:59

Vous pouvez vérifier le nom de la clé avant de la modifier.

Est-ce que cela aide? Essayez-le en exécutant l'extrait de code.

const arr = [{
    id: 1,
    ip: 'xx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: ''
  },
  {
    id: 2,
    ip: 'xxx.xxx.xx.xx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: ''
  },
  {
    id: 4,
    ip: 'xxx.xxx.xx.xxx',
    mn1: '',
    mn2: '',
    mn3: '',
    mn4: '',
    mn5: '',
    mn6: '',
    mn7: ''
  }
];

console.log('BEFORE', JSON.stringify(arr, null, 2));

for (const item of arr) {
  for (const key of Object.keys(item)) {
    if (!key.startsWith('mn')) continue;
    
    // know if the code gets here then it's an `mn` key
    
    // you can do logic here on the key
    // and then manipulate the result
    
    item[key] = 'changed';
  }
}

console.log('AFTER', arr);
1
Rico Kahler 20 nov. 2018 à 19:32