2015-02-25 14 views
6

Tôi cố gắng để thiết lập một phần tử mảng là một đối tượng tài sảnThiết lập một mảng phần tử như một đối tượng tài sản

ví dụ đơn giản:

var array = ['a', 'b', 'c']; 
var obj = { array[1]: 'good' } 

Trên gây ra một lỗi.

Cập nhật: Trong thực tế, tôi đi qua các đối tượng như là một phần của một mảng tức là một ví dụ đơn giản sẽ là:

aObj[value] = ['one', {array[1]: 'good'}, 'two', 'three', 'four']; 

Thiết lập obj[array[1]] = 'good'; phong cách có nghĩa là sử dụng

aObj[value][1][array[1]] = 'good'; 
+1

"* Tất nhiên tôi có thể khai báo phần tử mảng dưới dạng biến *". Không, bạn không thể, trừ khi bạn sử dụng tên thuộc tính được tính toán, được giới thiệu bởi ECMAScript 6. Mã thứ hai của bạn sẽ tạo ra khóa '" arr "', không phải '" b "'. – Oriol

+0

@Oriol .. Bạn đúng ... cảm ơn ... Tôi đã cập nhật và sửa bài đăng của tôi :) – erosman

+0

Tốt, cấu trúc dữ liệu đó cũng khó hiểu –

Trả lời

5

{ array[1]: 'good' } ném một lỗi vì, khi bạn sử dụng ký hiệu chữ Object trong JavaScript, nó xử lý chuỗi trước : làm số nhận dạng và tên số nhận dạng hợp lệ không được có [ hoặc ] trong đó.

Vì vậy, sử dụng [] ký hiệu, cho phép bất kỳ chuỗi được sử dụng như tên thuộc tính, như thế này

var array = ['a', 'b', 'c']; 
var obj = {}; 
obj[array[1]] = 'good'; 
+1

Ngoài ra, nó không thể là biến trước khi ':' – mplungjan

+0

Có vẻ trong ES6 bạn có thể có một biểu thức trước khi ':' như được đề cập bởi @dfsq – mplungjan

+1

Cảm ơn bạn thefourtheye! Như câu hỏi của tôi đó là một bản sao [ở đây] (http://stackoverflow.com/questions/29001580/object-literal-unexpected-token), tôi đã thêm 'GAME ['MYGAMEIDHERE'] = Monsters;', và nó tổ hoàn hảo ! –

3

Có lẽ đó là thời gian để bắt đầu cho ES6 trả lời quá. Trong ECMAScript6, bạn có thể sử dụng biểu thức làm khóa đối tượng:

var array = ['a', 'b', 'c']; 
var obj = { 
    [array[1]]: 'good' 
} 

Thực tế, cú pháp này đã được hỗ trợ trong Firefox.

Hiện tại, cách duy nhất để sử dụng biến là sử dụng ký hiệu ngoặc vuông như được mô tả trong câu trả lời khác.

+0

Cảm ơn bạn dfsq. Tôi đã cập nhật bài đăng của mình với nhiều thông tin hơn. Tôi thực sự mã hóa các kịch bản cho Firefox, Tuy nhiên, để tương thích hơn, tôi ở lại với ES5 trong thời gian này. ;) Tốt để biết mặc dù khi tôi đang mã hóa một addon Firefox. – erosman

+0

Tôi sau đó đứng một phần sửa chữa :) – mplungjan

+0

Trong ES5, bạn có thể làm: 'Object.defineProperty ({}, mảng [1], {value: 'good', enumerable: true})'. Điều đó có thể không được coi là một cải tiến. – rici

Các vấn đề liên quan