Làm cách nào để so sánh mảng định dạng JSON GIÁ TRỊ và KHÓA để tạo một mảng mới? trong góc 5


10

Đây là định dạng mảng JSON đầu tiên của tôi:

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

Đây là định dạng mảng JSON đầu tiên của tôi:

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

Ở đây tôi muốn so sánh GIÁ TRỊ hiện diện trong phần đầu tiên array(columnNames)và TỪ KHÓA có trong mảng thứ hai. Nếu nó bằng nhau, thì tôi muốn đẩy những dữ liệu phù hợp từ thứ hai array(rowData)sang mảng mới.

Và tôi muốn kết quả cuối cùng của mình như thế này:

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

Bạn đã thực hiện một nỗ lực này?
TylerH

Câu trả lời:


10

Lấy các trường từ mỗi đối tượng trong columnNamesmảng của bạn bằng cách sử dụng .map(). Sau đó, ánh xạ từng đối tượng vào rowDatamột đối tượng mới được tạo bằng cách sử dụng .reduce(), chỉ bao gồm các khóa từ fieldsmảng của bạn :

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

Nếu bạn có thể hỗ trợ Object.fromEntries()(lấy một mảng các [key, value]cặp lồng nhau và xây dựng một đối tượng từ chúng), thì không cần phải sử dụng .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 */


Hi tôi có một vấn đề. Bạn có thể giải quyết vấn đề của tôi? :) Đây là liên kết [ stackoverflow.com/questions/60089217/ từ
Sakkeer A

5

Bạn có thể filterthuộc tính đối tượng của bạn dựa trên columnNamesmảng và sau đó chỉ cần tạo một đối tượng bằng cách sử dụng Object.fromEntries:

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

Một ví dụ:

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

Hoặc phiên bản gỡ lỗi nhiều hơn:

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

Một ví dụ:

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 là phương thức biến đổi danh sách các cặp khóa-giá trị thành một đối tượng.

Hàng sau có nghĩa là chúng tôi lọc allProperies mảng () dựa trên columnNamesmảng.

Một số phương thức () trả về truenếu một số thuộc tính columnNamestồn tại trong allProperties:

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

Cảm ơn bạn rất nhiều vì phản ứng của bạn. Tôi nghi ngờ về điều đó, tôi là người mới bắt đầu 8 góc chính xác, tôi không biết "Object.fromEntries" là gì, và bạn cũng có thể giải thích điều này "hãy để lọc => cộtNames.some (cl => cl.field == k)); ". Cảm ơn bạn trong adavnce!
Praveen Sivanadiyar

@PraveenSivanadiyar xin vui lòng, xem câu trả lời được cập nhật của tôi
StepUp

@StepUp Xin chào, tôi có một vấn đề. Bạn có thể giải quyết vấn đề của tôi? :) Đây là liên kết [ stackoverflow.com/questions/60089217/ từ
Sakkeer A

3

Lưu trữ tất cả các tên trường trong một biến keysbằng cách sử dụng .map . Sau đó lặp qua mảng ban đầu và tạo một đối tượng có các thuộc tính có trongkeys

Hãy thử như thế này:

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

Trình diễn làm việc


Bạn có thể giải thích những gì sẽ xảy ra ở đây? Keys.forEach (key => {obj [key] = item [key]});
Praveen Sivanadiyar

Chắc chắn, tôi đang thêm mô tả
Adrita Sharma

@PraveenSivanadiyar Đã thêm mô tả. cho tôi biết nếu điều này hữu ích
Adrita Sharma

1
objlà một đối tượng trống mới. obj[key] = item[key] phương tiện, tham gia vòng đầu tiên, quan trọng là "Tên", vì vậy obj[key]sẽ {Name: }item.NamePraveen, vì vậy kết quả sẽ là {Name: "Praveen" }
Adrita Sharma

Vâng, bây giờ tôi hiểu và nó cũng hoạt động tốt với mã của tôi. cảm ơn bạn rất nhiều @Adrita Sharma.
Praveen Sivanadiyar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.