Thay đổi mảng trong javascript thành đối tượng đơn giản hơn


17

Tôi có một JSON đơn giản với một mảng chứa các đối tượng xa hơn, v.v. như thế này:

languagePack:
[
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
]

Nhưng điều tôi thực sự muốn là một đối tượng như thế này:

languagePack: 
{
    'Username': 'Benutzername',
    'Password': 'Passwort'
}

Vì vậy, tôi muốn giảm mảng thành các cặp khóa-giá trị đơn giản nằm trong một mảng hoặc thậm chí là một đối tượng (các khóa là duy nhất). Có ai có ý tưởng làm thế nào để giảm điều này với một số chức năng mảng tuyệt vời này không? Tôi chỉ nghĩ ra một cái gì đó giống như cho mỗi người và xây dựng tài sản "bằng tay" cho tài sản, nhưng tôi nhớ có một số thứ hay ho cho mảng như 'giảm', toán tử lây lan (...), map, every, một số, v.v.

Tôi đã thử nó với một cái gì đó như:

var temp = this.languagePack.map(([key, value]) => ({key,value}))
console.log(temp)

Nhưng điều đó chỉ khiến tôi nhận được thông báo lỗi TypeError: Invalid attempt to destructure non-iterable instance

Chỉnh sửa: Cả ba câu trả lời đều hoạt động tốt. Cảm ơn.



Các grouptrách nhiệm bỏ?
Bergi

Có, nhóm có thể bị bỏ qua, đó chỉ là ý tưởng của đồng nghiệp của tôi khi sử dụng cùng một khóa trong các màn hình khác nhau với các bản dịch khác nhau, nhưng tôi không thể tìm thấy bất kỳ mục đích sử dụng thực sự nào cho nó. Nhưng đó là một câu hỏi khác cho nhiều sau này :)
Marcel Grüger

Câu trả lời:


11

Về cơ bản, bạn cần sử dụng forEachthay vì maphàm và sau đó bạn có thể xây dựng đối tượng đó thành bất kỳ khóa, cặp giá trị nào bạn muốn giữ.

Hãy thử điều này, nó sẽ giải quyết vấn đề của bạn.

var temp = {};

this.languagePack.forEach(({key,value}) => {
    temp[key] = value
})

console.log(temp)

Lưu ý: Ở đây chúng tôi không sử dụng mapvì chúng tôi muốn trả về đối tượng không phải là một mảng, vì vậy, chúng tôi có thể sử dụng reducehàm ở đây để làm như vậy, nhưng tôi nghĩ rằng điều này sẽ đơn giản và dễ hiểu những gì chúng tôi muốn và chúng tôi đang làm gì ở đây.


10

Bạn có thể sử dụng reducehàm javascript để tạo một đối tượng trống và đặt từng khóa và giá trị vào đó.

const data = [
  {
    'key': 'Username',
    'value': 'Benutzername',
    'group': 'default'
  },
  {
    'key': 'Password',
    'value': 'Passwort',
    'group': 'default'
  }
];

const newData = data.reduce((acc, row) => {
  acc[row.key] = row.value;
  return acc;
}, {});

console.log(newData);

Chỉnh sửa: Đề nghị tốt đẹp của Donny Verduijn . Bạn có thể sử dụng hàm hủy es6 để viết hàm ngắn hơn.

const newData = data.reduce((acc, { key, value }) => ({ ...acc, [key]: value }), {});

3
Nếu bạn muốn sử dụng cú pháp ES6, bạn cũng có thể thực hiện chức năng (acc, { key, value }) => ({ ...acc, [key]: value })
rút gọn

1
Ngoài ra, bạn có thể sử dụng toán tử dấu phẩy để tránh trả lại:const newData = data.reduce((acc, row) => (acc[row.key] = row.value, acc), {});
ElChiniNet

4
Chỉ là một sự tò mò. Cách đây một thời gian, tôi đã kiểm tra hiệu năng của toán tử lây lan để phá hủy các đối tượng và thậm chí nếu đúng là đôi khi nó cải thiện khả năng đọc mã, nó có chi phí cao: đoethat.net / Benchmark / Show / 6194/5 / ...
ElChiniNet

@ElChiniNet Trường hợp thử nghiệm mà bạn liên kết là về trải rộng mảng, không phải trải rộng đối tượng. (Nhưng vâng, liên tục lan truyền vào một đối tượng mới chậm hơn nhiều so với việc đột biến một đối tượng)
Bergi

1
@Bergi, ở đây bạn có sự so sánh giữa mã cụ thể này: measurethat.net/Benchmarks/Show/6318/0/...
ElChiniNet

6

sử dụng với Array#mapnó tạo khóa và giá trị làm đối tượng và Object.assignchuyển đổi giá trị mảng thành đối tượng

const languagePack = [ { 'key': 'Username', 'value': 'Benutzername', 'group': 'default' }, { 'key': 'Password', 'value': 'Passwort', 'group': 'default' } ];

var res = Object.assign({},...languagePack.map(({key,value}) => ({[key]:value})))

console.log(res)


2

Bạn có thể sử dụng ES6 Mapcho việc sử dụng đó Object.fromEntriesđể chuyển đổi maptrở lại Object.

Để biết thêm thông tin về Bản đồ

let languagePack=
[{
  'key': 'Username',
  'value': 'Benutzername',
  'group': 'default'
},
{
  'key': 'Password',
  'value': 'Passwort',
  'group': 'default'
}];

let map = new Map();

languagePack.forEach((val)=>{
  map.set(val.key, val.value);
})
languagePack = Object.fromEntries(map);
console.log(languagePack);

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.