Come confrontare la matrice di formato JSON VALUE e KEY per creare una nuova matrice? in Angolare 5


10

Ecco il mio primo formato di array JSON:

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

Ecco il mio primo formato di array 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"},
];  

Qui voglio confrontare il VALORE che è presente nel primo array(columnNames)e KEYS che è presente nel secondo array. Se è uguale, allora voglio array(rowData)inserire i dati corrispondenti dal secondo nel nuovo array.

E voglio il mio risultato finale in questo modo:

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"},
];

Hai tentato tu stesso?
TylerH,

Risposte:


10

Prendi i campi da ciascun oggetto nel tuo columnNamesarray usando .map(). Quindi, associa ogni oggetto rowDataa un nuovo oggetto creato utilizzando .reduce(), che include solo le chiavi fieldsdell'array:

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 */

Se è possibile supportare Object.fromEntries()(che accetta una matrice di [key, value]coppie nidificate e crea un oggetto da esse), non è necessario utilizzare .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 */


Ciao ho un problema. Potresti risolvere il mio problema? :) Ecco il link [ stackoverflow.com/questions/60089217/...
Sakkeer A

5

È possibile creare filterle proprietà dell'oggetto in base columnNamesall'array e quindi creare un oggetto utilizzando Object.fromEntries:

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

Un esempio:

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);

O versione più debuggable:

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 esempio:

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 è il metodo che trasforma un elenco di coppie chiave-valore in un oggetto.

La riga seguente significa che filtriamo l' allProperies array () in base columnNamesall'array.

Il metodo some () restituisce truese columnNamesesiste una proprietà di allProperties:

let filteredProperties = allProperties.filter(([k, v]) => 
     columnNames.some(cl => cl.field == k)); 

Grazie mille per la tua risposta. ne dubito, sono un principiante di Angular 8 esattamente non so cosa sia "Object.fromEntries", e puoi anche spiegarlo "let filteredProperties = allProperties.filter (([k, v]) => columnNames.some (cl => cl.field == k)); ". Grazie adavnce!
Praveen Sivanadiyar il

@PraveenSivanadiyar, per favore, vedi la mia risposta aggiornata
StepUp

@StepUp Ciao, ho un problema. Potresti risolvere il mio problema? :) Ecco il link [ stackoverflow.com/questions/60089217/...
Sakkeer A

3

Memorizza tutti i nomi dei campi in una variabile keysusando .map . Quindi scorrere la matrice originale e creare un oggetto con le proprietà presenti inkeys

Prova in questo modo:

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)
});

Demo di lavoro


Puoi spiegare cosa accadrà qui? keys.forEach (key => {obj [key] = item [key]});
Praveen Sivanadiyar il

Certo, sto aggiungendo la descrizione
Adrita Sharma il

@PraveenSivanadiyar Descrizione aggiunta. fatemi sapere se questo è stato utile
Adrita Sharma il

1
objè un nuovo oggetto vuoto. obj[key] = item[key] significa, prendendo il primo ciclo, la chiave è "Nome", quindi obj[key]sarà {Name: }ed item.Nameè Praveen, quindi il risultato sarà {Name: "Praveen" }
Adrita Sharma

Sì, ora capisco e funziona anche bene con il mio codice. grazie mille @Adrita Sharma.
Praveen Sivanadiyar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.