Comment comparer le tableau au format JSON VALUE et KEY pour créer un nouveau tableau? dans Angular 5

10

Voici mon premier format de tableau JSON:

this.columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];

Voici mon premier format de tableau JSON:

this.rowData = [
  {Name : "Praveen",Address : "aiff",Age : "12",w :  "1",e :  "8"},
  {Name : "Akashay",Address : "xvn",Age : "15",w :  "2",e :  "7"},
  {Name : "Bala",Address : "hjk",Age : "16",w :  "3",e :  "6"}, 
  {Name : "Charu",Address : "sss",Age : "17",w :  "4",e :  "5"},
];  

Ici, je veux comparer la VALEUR qui est présente dans le premier array(columnNames)et les CLÉS qui sont présentes dans le second tableau. Si c'est égal, alors je veux pousser ces données correspondantes de la seconde array(rowData)dans le nouveau tableau.

Et je veux mon résultat final comme ceci:

public rowData: any =[
  {Name : "Praveen",Address : "aiff",Age : "12"},
  {Name : "Akashay",Address : "xvn",Age : "15"},
  {Name : "Bala",Address : "hjk",Age : "16"}, 
  {Name : "Charu",Address : "sss",Age : "17"},
];
Praveen Sivanadiyar
la source
Avez-vous tenté de le faire vous-même?
TylerH

Réponses:

10

Saisissez les champs de chaque objet de votre columnNamestableau à l'aide de .map(). Ensuite, mappez chaque objet dans rowDataun nouvel objet créé à l'aide de .reduce(), qui inclut uniquement les clés de votre fieldstableau:

const columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];

const rowData = [
  {Name : "Praveen",Address : "aiff",Age : "12",w :  "1",e :  "8"},
  {Name : "Akashay",Address : "xvn",Age : "15",w :  "2",e :  "7"},
  {Name : "Bala",Address : "hjk",Age : "16",w :  "3",e :  "6"}, 
  {Name : "Charu",Address : "sss",Age : "17",w :  "4",e :  "5"},
];  

const fields = columnNames.map(({field}) => field); // get array ["Name", "Address", "Age"]
const result = rowData.map( // map each object in rowData to a new object
  o => fields.reduce((obj, k) => ({...obj, [k]: o[k]}), {})
  //    ^^ construct the new object, using reduce, spread syntax and computed property names
);

console.log(result);
.as-console-wrapper { max-height: 100% !important;} /* ignore */

Si vous pouvez prendre en charge Object.fromEntries()(qui prend un tableau de [key, value]paires imbriquées et en construit un objet), il n'est pas nécessaire d'utiliser .reduce():

const columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];

const rowData = [
  {Name : "Praveen",Address : "aiff",Age : "12",w :  "1",e :  "8"},
  {Name : "Akashay",Address : "xvn",Age : "15",w :  "2",e :  "7"},
  {Name : "Bala",Address : "hjk",Age : "16",w :  "3",e :  "6"}, 
  {Name : "Charu",Address : "sss",Age : "17",w :  "4",e :  "5"},
];  

const fields = columnNames.map(({field}) => field);
const result = rowData.map( 
  o => Object.fromEntries(fields.map(k => [k, o[k]]))
);

console.log(result);
.as-console-wrapper { max-height: 100% !important;} /* ignore */

Nick Parsons
la source
Bonjour j'ai un problème. Pourriez-vous résoudre mon problème? :) Voici le lien [ stackoverflow.com/questions/60089217/…
Sakkeer A
5

Vous pouvez filtervos propriétés d'objet basées sur un columnNamestableau, puis créez simplement un objet en utilisant Object.fromEntries:

const result = rowData.map(s => Object.fromEntries(
    Object.entries(s).filter(([k, v]) => columnNames.some(cl => cl.field == k))));

Un exemple:

let columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];

let rowData = [
  {Name : "Praveen",Address : "aiff",Age : "12",w :  "1",e :  "8"},
  {Name : "Akashay",Address : "xvn",Age : "15",w :  "2",e :  "7"},
  {Name : "Bala",Address : "hjk",Age : "16",w :  "3",e :  "6"},
  {Name : "Charu",Address : "sss",Age : "17",w :  "4",e :  "5"},
];

const result = rowData.map(s => Object.fromEntries(
    Object.entries(s).filter(([k, v]) => columnNames.some(cl => cl.field == k))));
console.log(result);

Ou version plus débogable:

const result = rowData.map(s => {
  let allProperties = Object.entries(s);
  let filteredProperties = allProperties.filter(([k, v]) => 
      columnNames.some(cl => cl.field == k));
  let result = Object.fromEntries(filteredProperties);
  return result;
})

Un exemple:

let columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];

let rowData = [
  {Name : "Praveen",Address : "aiff",Age : "12",w :  "1",e :  "8"},
  {Name : "Akashay",Address : "xvn",Age : "15",w :  "2",e :  "7"},
  {Name : "Bala",Address : "hjk",Age : "16",w :  "3",e :  "6"},
  {Name : "Charu",Address : "sss",Age : "17",w :  "4",e :  "5"},
];

const result = rowData.map(s => {
  let allProperties = Object.entries(s);
  let filteredProperties = allProperties.filter(([k, v]) => 
      columnNames.some(cl => cl.field == k));
  let result = Object.fromEntries(filteredProperties);
  return result;
})

Object.fromEntries est la méthode qui transforme une liste de paires clé-valeur en objet.

La ligne suivante signifie que nous filtrons () le allProperies tableau en fonction du columnNamestableau.

La méthode some () renvoie truesi une propriété de columnNamesexiste dans allProperties:

let filteredProperties = allProperties.filter(([k, v]) => 
     columnNames.some(cl => cl.field == k)); 
StepUp
la source
Merci beaucoup pour votre réponse. j'ai un doute là-dessus, je suis un débutant de l'angulaire 8 exactement, je ne sais pas ce qu'est "Object.fromEntries", et pouvez-vous également expliquer celui-ci "laissez filterProperties = allProperties.filter (([k, v]) => columnNames.some (cl => cl.field == k)); ". Merci en adavnce!
Praveen Sivanadiyar
@PraveenSivanadiyar s'il vous plaît, voir ma réponse mise à jour
StepUp
@StepUp Salut, j'ai un problème. Pourriez-vous résoudre mon problème? :) Voici le lien [ stackoverflow.com/questions/60089217/…
Sakkeer A
3

Stockez tous les noms de champ dans une variable à l' keysaide de .map . Parcourez ensuite le tableau d'origine et créez un objet ayant les propriétés présentes danskeys

Essayez comme ceci:

let keys = this.columnNames.map(x => x.field);

this.rowData.forEach(item => {
  let obj = {}
  keys.forEach(key => {
    obj[key] = item[key]
  });
  this.result.push(obj)
});

Démo de travail

Adrita Sharma
la source
Pouvez-vous expliquer ce qui se passera ici? keys.forEach (key => {obj [key] = item [key]});
Praveen Sivanadiyar
Bien sûr,
j'ajoute
@PraveenSivanadiyar Description ajoutée. laissez-moi savoir si cela a été utile
Adrita Sharma
1
objest un nouvel objet vide. obj[key] = item[key] signifie, en prenant la première boucle, la clé est "Nom", ainsi en obj[key]sera {Name: }et en item.Nameest Praveenainsi le résultat sera {Name: "Praveen" }
Adrita Sharma
Ouais, maintenant je comprends et ça marche très bien avec mon code. merci beaucoup @Adrita Sharma.
Praveen Sivanadiyar