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.
5 Réponses :
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);
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);
Cela changera un 0 explicite en 100 .
@Barmar belle prise, corrigée.
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
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 inputVoici l'exemple:
dataSource1.map(d => ({...hash, ...d}));
dataSource2.map(d => ({...hash, ...d}));
dataSource3.map(d => ({...hash, ...d}));
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;
}
}
}