如何比较 JSON 格式数组 VALUE 和 KEY 以创建新数组?在 Angular 5

Pra*_*yar 10 arrays comparison angular

这是我的第一个 JSON 数组格式:

this.columnNames = [
  {field : "Name"},
  {field : "Address"},
  {field : "Age"}
];
Run Code Online (Sandbox Code Playgroud)

这是我的第一个 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"},
];  
Run Code Online (Sandbox Code Playgroud)

在这里,我想比较第一个array(columnNames)数组中的 VALUE和第二个数组中的 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"},
];
Run Code Online (Sandbox Code Playgroud)

Nic*_*ons 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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important;} /* ignore */
Run Code Online (Sandbox Code Playgroud)

如果您可以支持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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important;} /* ignore */
Run Code Online (Sandbox Code Playgroud)


Ste*_*pUp 5

您可以filter基于columnNames数组创建对象属性,然后使用Object.fromEntries以下方法创建对象:

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

一个例子:

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

或更可调试的版本:

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;
})
Run Code Online (Sandbox Code Playgroud)

一个例子:

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);
Run Code Online (Sandbox Code Playgroud)

Object.fromEntries是将键值对列表转换为对象的方法。

下面一行表示我们基于数组filter() 数组。allProperiescolumnNames

true如果某些属性columnNames存在于 中,则some()方法返回allProperties

let filteredProperties = allProperties.filter(([k, v]) => 
     columnNames.some(cl => cl.field == k)); 
Run Code Online (Sandbox Code Playgroud)