Yeni bir dizi oluşturmak için JSON biçimi dizi VALUE ve KEY nasıl karşılaştırılır? Açısal 5


10

İşte benim ilk JSON dizi formatı:

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

İşte benim ilk JSON dizi formatı:

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

Burada ilkinde bulunan DEĞER ile array(columnNames)ikinci dizide bulunan KEYS karşılaştırmak istiyorum . Eşitse, bu eşleşen verileri ikinci array(rowData)diziden yeni diziye itmek istiyorum .

Ve nihai sonucumu şöyle istiyorum:

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

Bunu kendiniz denediniz mi?
TylerH

Yanıtlar:


10

Öğesini columnNameskullanarak dizinizdeki her nesneden alanları yakalayın .map(). Ardından, her nesneyi rowDatakullanarak .reduce()yalnızca fieldsdizinizdeki anahtarları içeren yeni bir nesneyle eşleyin:

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

Destekleyebiliyorsanız Object.fromEntries()(bir dizi iç içe [key, value]çift ​​alır ve onlardan bir nesne oluşturur), kullanmanıza gerek yoktur .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 */


Merhaba, bir problemim var. Sorunumu çözebilir misiniz? :) İşte bağlantı [ stackoverflow.com/questions/60089217/…
Sakkeer A

5

filterNesne özelliklerinizi columnNamesdiziye dayalı olarak yapabilir ve ardından aşağıdakileri kullanarak bir nesne oluşturabilirsiniz Object.fromEntries:

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

Bir örnek:

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

Veya daha fazla hata ayıklanabilir sürüm:

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

Bir örnek:

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 , anahtar / değer çiftlerinin listesini bir nesneye dönüştüren yöntemdir.

Aşağıdaki satır, () allProperies dizisini diziye göre filtrelediğimiz anlamına gelir columnNames.

Bazı () yöntemi döndürür truebazı özellik ise columnNamesbulunmaktadır allProperties:

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

Yanıtınız için çok teşekkür ederim. Ben şüphe var, ben açısal 8 bir acemi duyuyorum tam olarak ne "Object.fromEntries" olduğunu bilmiyorum, ve ayrıca u bunu açıklamak lütfen "let filterProperties = allProperties.filter (([k, v]) => columnNames.some (cl => cl.field == k)); ". Adavnce teşekkürler!
Praveen Sivanadiyar

@PraveenSivanadiyar lütfen, güncellenmiş cevabımı gör
StepUp

@StepUp Merhaba, bir sorunum var. Sorunumu çözebilir misiniz? :) İşte bağlantı [ stackoverflow.com/questions/60089217/…
Sakkeer A

3

Tüm alan adlarını .mapkeys kullanarak bir değişkende depolayın . Ardından, orijinal dizi arasında döngü yapın ve içinde özellikleri bulunan bir nesne oluşturunkeys

Şunu deneyin:

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

Çalışma Demosu


Burada ne olacağını açıklayabilir misiniz? keys.forEach (key => {obj [anahtar] = öğe [anahtar]});
Praveen Sivanadiyar

Tabii, açıklamayı ekliyorum
Adrita Sharma

@PraveenSivanadiyar Ek açıklama. bunun yararlı olup olmadığını bana bildirin
Adrita Sharma

1
objyeni, boş bir nesnedir. obj[key] = item[key] araçlar, birinci döngü alarak anahtar yüzden, "İsim" dir obj[key]olacak {Name: }ve item.Namebir Praveensonuç olacak, böylece {Name: "Praveen" }
Adrita Sharma

Evet, Şimdi anladım ve kodumla da iyi çalışıyor. Çok teşekkür ederim @ Adrita Sharma.
Praveen Sivanadiyar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.