एक नया सरणी बनाने के लिए JSON प्रारूप सरणी VALUE और कुंजी की तुलना कैसे करें? कोणीय 5 में


10

यहाँ मेरा पहला JSON सरणी प्रारूप है:

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

यहाँ मेरा पहला 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"},
];  

यहाँ मैं VALUE की तुलना करना चाहता हूँ जो पहले array(columnNames)और KEYS में मौजूद है जो दूसरे सरणी में मौजूद है। यदि यह समान है, तो मैं उन मिलान डेटा को दूसरे array(rowData)से नए सरणी में धकेलना चाहता हूं ।

और मैं अपना अंतिम परिणाम इस तरह चाहता हूं:

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

क्या आपने खुद इस पर कोई प्रयास किया?
टायलरएच

जवाबों:


10

columnNamesका उपयोग कर अपने सरणी में प्रत्येक ऑब्जेक्ट से फ़ील्ड को पकड़ो .map()। फिर, प्रत्येक ऑब्जेक्ट rowDataका उपयोग करके बनाई गई एक नई ऑब्जेक्ट पर मैप करें .reduce(), जिसमें केवल आपके fieldsसरणी से कुंजियाँ शामिल हैं :

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

यदि आप समर्थन कर सकते हैं Object.fromEntries()(जो नेस्टेड [key, value]जोड़े की एक सरणी लेता है और उनसे एक ऑब्जेक्ट बनाता है), तो उपयोग करने की कोई आवश्यकता नहीं है .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 */


हाय मुझे एक समस्या है। क्या आप मेरी समस्या हल कर सकते हैं? :) यहाँ लिंक है [ stackoverflow.com/questions/60089217/…
सकर ए

5

आप सरणी के filterआधार पर अपने ऑब्जेक्ट प्रॉपर्टीज का उपयोग कर सकते हैं columnNamesऔर फिर केवल एक ऑब्जेक्ट का उपयोग कर सकते हैं Object.fromEntries:

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

एक उदाहरण:

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

या अधिक डिबग करने योग्य संस्करण:

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

एक उदाहरण:

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 वह विधि है जो कुंजी-वैल्यू पेयर की सूची को ऑब्जेक्ट में बदल देती है।

निम्न पंक्ति का अर्थ है कि हम सरणी के आधार पर फ़िल्टर () सरणी।allProperiescolumnNames

trueयदि कुछ संपत्ति columnNamesमौजूद है तो कुछ () विधि वापस आती है allProperties:

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

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मुझे इसमें संदेह है, मैं एक कोणीय 8 का आरंभक हूं, वास्तव में मुझे पता नहीं है कि "Object.fromEntries" क्या है, और क्या आप इसे एक भी समझा सकते हैं "filteredProperties = allProperties.filter ([k, v]) => columnNames.some (cl => cl.field == k)); ”। U adavnce में धन्यवाद!
प्रवीण शिवनदियार

@PraveenSivanadiyar कृपया, मेरा अद्यतन जवाब देखें
StepUp

@StepUp हाय, मुझे एक समस्या है। क्या आप मेरी समस्या हल कर सकते हैं? :) यहाँ लिंक है [ stackoverflow.com/questions/60089217/…
सकरियर

3

.Mapkeys का उपयोग करके सभी फ़ील्ड नामों को स्टोर करें । फिर मूल सरणी के माध्यम से लूप करें और इसमें मौजूद गुणों वाली एक वस्तु बनाएंkeys

इस तरह की कोशिश करें:

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

वर्किंग डेमो


क्या आप बता सकते हैं कि यहां क्या हो रहा है? keys.forEach (कुंजी => {obj [कुंजी] = आइटम [कुंजी]});
प्रवीण शिवनदियार

ज़रूर, मैं विवरण जोड़ रहा हूं
Adrita Sharma

@PraveenSivanadiyar जोड़ा वर्णन। मुझे पता है कि यह मददगार था
Adrita Sharma

1
objएक नई खाली वस्तु है। obj[key] = item[key] मतलब, पहला लूप लेना, कुंजी "नाम" है, इसलिए obj[key]होगा {Name: }और item.Nameहै Praveen, इसलिए परिणाम होगा {Name: "Praveen" }
आद्री शर्मा

हाँ, अब मैं समझता हूँ और अपने कोड के साथ इसके ठीक काम भी। थैंक यू सो मच @ Adrita Sharma
प्रवीण शिवनदियार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.