3
votes

Comment ajouter une paire clé / valeur à un tableau en Javascript / Jquery

J'ai 2 tableaux comme ci-dessous

var dataSource = [
{location: "France", January: 79, February: 81, March: 23},  
{location: "Germany", January: 98, February: 83},
{location: "Japan", January: 96, March: 11} ];

var Months = ["January","February","March"];

dataSource.forEach(function(element) {
Months.forEach(function(item) {
  if (!(item in element)) {
//Object.assign(dataSource, {item: 100}); 
//dataSource = {...dataSource, ...{item: 100}}
dataSource.push({item: 100});
  }
});
});

console.log(dataSource);

Je veux parcourir chaque objet dans dataSource et vérifier si toutes les valeurs de Mois existent dans chaque objet de dataSource . Si la valeur n'existe pas dans dataSource , ajoutez cette valeur à dataSource avec value = 100

exemple: dans la région Allemagne, le mois "Mars "n'existe pas, je dois donc appuyer sur la clé et la valeur March: 100

à la fin dataSource doit être comme ci-dessous

XXX

J'ai essayé de nombreuses solutions des threads précédents mais je n'obtiens pas le résultat exact que je souhaite. Voici quelques-unes de mes idées

var dataSource = [
{location: "France", January: 79, February: 81, March: 23},  
{location: "Germany", January: 98, February: 83, March: 100},
{location: "Japan", January: 96, February: 100, March: 11} ];

Merci pour vos suggestions.


0 commentaires

5 Réponses :


6
votes

Vous pouvez utiliser Array. map () pour itérer le tableau dataSource . Utilisez un Array.reduce () pour parcourir les mois et ajouter les mois manquants à l'objet actuel:

const dataSource = [{"location":"France","January":79,"February":81,"March":23},{"location":"Germany","January":98,"February":83},{"location":"Japan","January":96,"March":11}];
const Months = ["January","February","March"];

const result = dataSource.map(o =>
  Months.reduce((obj, m) => m in obj ? obj : { ...obj, [m]: 100 }, o)
);

console.log(result);


0 commentaires

2
votes

Vous pouvez parcourir les sources et les mois en boucle, en définissant les mois sur les sources comme la valeur qu'ils ont déjà, ou par défaut à 100.

var dataSource = [{
    location: "France",
    January: 79,
    February: 81,
    March: 23
  },
  {
    location: "Germany",
    January: 98,
    February: 83
  },
  {
    location: "Japan",
    January: 96,
    March: 11
  }
];

var Months = ["January", "February", "March"];

dataSource.forEach(function(element){
  Months.forEach(function(month){
    if (element[month] === undefined) element[month] = 100;
  });
});

console.log(dataSource);


2 commentaires

Cela changera un 0 explicite en 100 .


@Barmar belle prise, corrigée.



0
votes

Cela peut peut-être vous aider. Exécutez simplement test () dans les outils de développement ou quelque chose et regardez la sortie console.log

faites attention à l'objet uniqueKeys car c'est là que la logique principale est centrée autour et les trucs hasOwnProperty

function test() {

    var uniqueKeys = {location: ''};                        //default to have location set
    var Months = ['January', 'February', 'March'];

    for (var i = 0; i < Months.length; i++) {
        uniqueKeys[Months[i]] = '';                     //just populate the object from the array to use soon
    }


    for (var i = 0; i < dataSource.length; i++) {




        var validObject = true;
        Object.keys(uniqueKeys).forEach((e,j) => {

            if (dataSource[i].hasOwnProperty(e) === false) {
                validObject = false;
            }

        });

        if (validObject === false) {

            console.log('add to', dataSource[i], 'to balance it out');

        }
    }
}

espérons que cela aide certains ~ acclamations


0 commentaires

1
votes

Ou bien, vous pouvez créer un hachage avec les mois résultants et leurs valeurs, que vous pouvez directement utiliser, en affectant chaque objet de votre tableau par-dessus. Ainsi, vous pouvez traiter N nombre d'entrées (tableaux) avec le même hachage.

Exemple de hachage résultant: {janvier: 100, février: 100, mars: 100} code >

Et puis vous pouvez faire ceci N nombre de fois:

let dataSource = [{"location":"France","January":79,"February":81,"March":23},{"location":"Germany","January":98,"February":83},{"location":"Japan","January":96,"March":11}],
    Months = ["January","February","March"],
    hash = Months.reduce((r, e) => ({...r, [e]: 100}), {}),
    res = dataSource.map(d => ({...hash, ...d}));
    
console.log('This is your hash: ', hash); //This is the hash generated one time
console.log('This is your result: ', res); //this is the result against that input

Voici l'exemple:

dataSource1.map(d => ({...hash, ...d}));
dataSource2.map(d => ({...hash, ...d}));
dataSource3.map(d => ({...hash, ...d}));


0 commentaires

0
votes

Peut-être cette solution courte qui itère au fil des mois et vérifie si ce mois est présent dans chaque enregistrement pour la source de données. Sinon, ajoutez la valeur par défaut, 100 dans votre cas

for(i=0;i<dataSource.length;i++){
        for(j=0;j<Months.length;j++){
            if(Months[j] in dataSource[i]){
            }
            else{
                dataSource[i][Months[j]] = 100;
            }   
        }
    }


0 commentaires