Tạo đối tượng từ mảng


83

Tôi muốn tạo đối tượng từ danh sách mảng. Tôi có một mảng động, giả sử trông giống như sau:

var dynamicArray = ["2007", "2008", "2009", "2010"];

và với một số javascript es6, tôi muốn tạo một đối tượng như thế này:

const obj = {
    2007: {
        x: width / 5,
        y: height / 2
    },
    2008: {
        x: (2 / 5) * width,
        y: height / 2
    },
    2009: {
        x: (3 / 5) * width,
        y: height / 2
    },
    2010: {
        x: (4 / 5) * width,
        y: height / 2
    }
}

đừng lo lắng về các đối tượng bên trong mà chỉ muốn tạo một cấu trúc như thế này:

 obj = {
      2007: ...,
      2008: ...,
      ...
    }

Xin vui lòng giúp đỡ, Cảm ơn.


2
Được chứ. Bạn đã thử những gì? Bạn đang mắc kẹt ở đâu? Bạn đã thực hiện nghiên cứu nào? Bạn đã nhìn vào điều này , chẳng hạn?
TJ Crowder

Câu trả lời:


202

Đơn giản

 const obj = {};

 for (const key of yourArray) {
      obj[key] = whatever;
 }

hoặc nếu bạn thích kiểu "chức năng":

 const obj = yourArray.reduce((o, key) => Object.assign(o, {[key]: whatever}), {});

sử dụng toán tử lây lan đối tượng hiện đại:

const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})

Thí dụ:

[
  { id: 10, color: "red" },
  { id: 20, color: "blue" },
  { id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})

Đầu ra:

{red: 10, blue: 20, green: 30}

Đây là cách nó làm việc:

reduceđược khởi tạo với một đối tượng rỗng (rỗng {}ở cuối), do đó các biến lặp đầu tiên là acc = {} cur = { id: 10, color: "red" }. Hàm trả về một đối tượng - đây là lý do tại sao thân hàm được bao bọc trong dấu ngoặc đơn => ({ ... }). Toán tử Spread không thực hiện bất cứ điều gì trong lần lặp đầu tiên, vì vậy red: 10được đặt làm mục đầu tiên.

Trên các biến lặp thứ hai là acc = { red: 10 } cur = { id: 20, color: "blue" }. Ở đây toán tử spread sẽ mở rộng acc và hàm trả về { red: 10, blue: 20 }.

Lần lặp thứ ba acc = { red: 10, blue: 20 } cur = { id: 30, color: "green" }, vì vậy khi accđược rải bên trong đối tượng, hàm của chúng ta sẽ trả về giá trị cuối cùng.


1
Cảm ơn! Nó hoạt động theo yêu cầu. Tôi chưa bao giờ biết về array.reducechức năng.
Hussain Dehgamwala

Nếu bạn thích phong cách chức năng hơn, và tôi cũng vậy, bạn nên sử dụng const. Trên thực tế, bạn nên sử dụng nó bất kể. Ngoài ra, nếu bạn có quyền truy cập vào ES Tiếp theo cú pháp còn lại / lan (nói qua nguyên cảo hoặc Babel), bạn có thể viết const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})và thậm chí tránh đột biến hạt giống: p
Aluan Haddad

1
@AluanHaddad: gợi ý tốt, đã chuyển đổi bài viết sang CW, thoải mái chỉnh sửa.
georg

({... o, [key]: applicationDoc [key]}) .. trong đó applicationDoc là một số pojo. Tôi muốn chỉ nhận các giá trị được xác định trong ứng viênDoc. Nhưng tôi nhầm lẫn với dấu ngoặc đơn, dường như không thể nhận được 'return' hoặc câu lệnh if hoạt động. Bạn có thể chỉ cho tôi hướng đi đúng - không sợ hãi khi đọc tài liệu.
terary

1
@cameck: cảm ơn, bài là CW, thoải mái chỉnh sửa.
georg

33

Tính năng mới Object.fromEntries, từ ECMAScript 2019, giúp việc chuyển đổi các giá trị từ một mảng thành các khóa trong một đối tượng như sau trở nên dễ dàng hơn

const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
  dynamicArray.map(year => [year, {
    something: "based",
    on: year
  }])
)

console.log(obj)


17

trong js với hàm giảm es6 cho mảng tôi làm như thế này

let x = [1,2,3]
let y = x.reduce((acc, elem) => {
  acc[elem] = elem // or what ever object you want inside
  return acc
}, {})
console.log(y) // {1:1, 2:2, 3:3}

3
thậm chí còn ngắn hơn:[1, 2, 3].reduce((x, y)=>(x[y] = 1, x), {})
exebook Ngày

4
var keys = ['key1', 'key2', 'key3']

var object = Object.assign({}, ...Object.entries({...keys}).map(([a,b]) => ({ [b]: 'someValue' })))
console.log(object)

Điều này sẽ tạo ra

{ key1: 'someValue', key2: 'someValue', key3: 'someValue' }

0

Tôi thấy bạn thực sự chỉ có thể sử dụng Object.assign()trực tiếp với toán tử spread. Không cần phải giới thiệu thêm bất kỳ sự phức tạp nào với một reducehoặc mapchức năng.

Chỉ cần làm Object.assign(...yourArray, {})và bạn sẽ nhận được kết quả mong muốn của bạn. Thay vào đó, nếu bạn muốn hợp nhất mảng đối tượng của mình vào một đối tượng khác, bạn cũng có thể gọi Object.assign(...yourArray, yourObject)và nó cũng sẽ hoạt động tốt.

Bạn cũng có thể sử dụng cùng một phương pháp này để hợp nhất hai mảng thành một đối tượng, ngay cả khi một trong các mảng không chứa các đối tượng mà chỉ chứa các giá trị nguyên thủy - tuy nhiên, nếu bạn làm điều này, bạn cần đảm bảo rằng ít nhất một trong các mảng chỉ chứa các đối tượng như một nguyên thủy sẽ mặc định chỉ mục của nó là key, vì vậy bạn sẽ gặp lỗi nếu có một khóa trùng lặp.

Tuy nhiên, đối với mục đích OPs, không có rủi ro xảy ra các lỗi như anh ta đang hợp nhất với một đối tượng trống, đó là cách an toàn nhất.

const arr = [
  { a: 0 },
  { c: 1 },
  { e: 2 },
];

const obj = Object.assign(...arr, {});

console.log(obj)

// Results to:
// Object { a: 0, c: 1, e: 2 }

-4

bạn có thể dùng:

     dynamicArray.map(value => ({'key': value, 'val': 'whatever you want'}));

nhập mô tả hình ảnh ở đây


3
Không phải như những gì tôi muốn !!
Hussain Dehgamwala
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.