첫 번째 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)
와 두 번째 배열에 존재하는 KEY 를 비교하고 싶습니다 . 같으면 일치하는 데이터를 두 번째 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"},
];
답변
를 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 */
답변
당신은 할 수 있습니다 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 는 키-값 쌍의 목록을 객체로 변환하는 방법입니다.
다음 행은 배열을 기준으로 배열을 filter () 함을 의미합니다 .allProperies
columnNames
의 일부true
속성이 columnNames
존재하는 경우 some () 메서드가 반환 합니다 allProperties
.
let filteredProperties = allProperties.filter(([k, v]) =>
columnNames.some(cl => cl.field == k));