Làm thế nào để tạo từ điển và thêm các cặp giá trị key key một cách linh hoạt?


323

Từ bài viết:

Gửi một mảng JSON được nhận dưới dạng Từ điển <chuỗi, chuỗi>

Tôi đang cố gắng làm điều tương tự như bài đăng đó. Vấn đề duy nhất là tôi không biết những gì các khóa và giá trị được trả trước. Vì vậy, tôi cần có khả năng tự động thêm các cặp khóa và giá trị và tôi không biết làm thế nào để làm điều đó.

Có ai biết cách tạo đối tượng đó và thêm các cặp giá trị khóa một cách linh hoạt không?

Tôi đã thử:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

Nhưng điều đó không hiệu quả.


2
Nó hoạt động rất tốt. console.log (vars); hiển thị cho tôi [Khóa đối tượng: giá trị "newkey": "newvalue" proto : Object]
Alex Pliutau

Ngoại trừ nó là một danh sách, không phải từ điển: \ Tôi nghĩ rằng dữ liệu được thể hiện tốt hơn dưới dạng một danh sách "các cặp", như thế list = [["key1","value1"],["key2","value2"]]. Một số ngôn ngữ khác có loại "cặp" hoặc "tuple". tldr cho dict thực tế thêm:dict['key'] = "value"
Jordan Stewart

Câu trả lời:


552
var dict = []; // create an empty array

dict.push({
    key:   "keyName",
    value: "the value"
});
// repeat this last part as needed to add more key/value pairs

Về cơ bản, bạn đang tạo một đối tượng bằng chữ với 2 thuộc tính (được gọi keyvalue) và chèn nó (sử dụng push()) vào mảng.


Chỉnh sửa: Vì vậy, gần 5 năm sau, câu trả lời này đang bị hạ thấp bởi vì nó không tạo ra một đối tượng JS "bình thường" theo nghĩa đen (còn gọi là map, aka hash, aka dictionary). Tuy nhiên,
đang tạo ra cấu trúc mà OP yêu cầu (và được minh họa trong câu hỏi khác được liên kết đến), đó là một mảng gồm các đối tượng bằng chữ , mỗi đối tượngkeyvaluethuộc tính. Đừng hỏi tôi tại sao cấu trúc đó là bắt buộc, nhưng đó là cấu trúc được yêu cầu.

Nhưng, nhưng, nếu những gì bạn muốn trong một đối tượng JS đơn giản - chứ không phải cấu trúc mà OP yêu cầu - hãy xem câu trả lời của tcll , mặc dù ký hiệu ngoặc là hơi cồng kềnh nếu bạn chỉ có các khóa đơn giản là tên JS hợp lệ. Bạn chỉ có thể làm điều này:

// object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

Hoặc sử dụng ký hiệu chấm thông thường để đặt thuộc tính sau khi tạo đối tượng:

// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

Bạn thực sự muốn ký hiệu khung nếu bạn có các khóa có khoảng trắng trong đó, các ký tự đặc biệt hoặc những thứ tương tự. Ví dụ:

var dict = {};

// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";

// but this will
dict["some invalid key (for multiple reasons)"] = "value1";

Bạn cũng muốn ký hiệu khung nếu các phím của bạn là động:

dict[firstName + " " + lastName] = "some value";

Lưu ý rằng các khóa (tên thuộc tính) luôn là các chuỗi và các giá trị không phải là chuỗi sẽ được ép buộc thành một chuỗi khi được sử dụng làm khóa. Ví dụ: một Dateđối tượng được chuyển đổi thành biểu diễn chuỗi của nó:

dict[new Date] = "today's value";

console.log(dict);
// => {
//      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
//    }

Tuy nhiên, lưu ý rằng điều này không nhất thiết "chỉ hoạt động", vì nhiều đối tượng sẽ có biểu diễn chuỗi như "[object Object]" không tạo ra khóa không duy nhất. Vì vậy, hãy cảnh giác với một cái gì đó như:

var objA = { a: 23 },
    objB = { b: 42 };

dict[objA] = "value for objA";
dict[objB] = "value for objB";

console.log(dict);
// => { "[object Object]": "value for objB" }

Mặc dù objAobjBlà các yếu tố hoàn toàn khác biệt và độc đáo, cả hai đều có cùng biểu diễn chuỗi cơ bản : "[object Object]".

Lý do Datekhông hành xử như thế này là Datenguyên mẫu có một tùy chỉnhtoString phương thức ghi đè biểu diễn chuỗi mặc định. Và bạn có thể làm tương tự:

// a simple constructor with a toString prototypal method
function Foo() {
  this.myRandomNumber = Math.random() * 1000 | 0;
}

Foo.prototype.toString = function () {
  return "Foo instance #" + this.myRandomNumber;
};

dict[new Foo] = "some value";

console.log(dict);
// => {
//      "Foo instance #712": "some value"
//    }

(Lưu ý rằng vì ở trên sử dụng một số ngẫu nhiên , các xung đột tên vẫn có thể xảy ra rất dễ dàng. Nó chỉ để minh họa cho việc thực hiện toString.)

Vì vậy, khi cố gắng sử dụng các đối tượng làm khóa, JS sẽ sử dụng toStringtriển khai riêng của đối tượng , nếu có hoặc sử dụng biểu diễn chuỗi mặc định.


2
Đó có phải là liên kết?
Csaba Toth

1
@CsabaToth Không, dictkhông phải là một từ điển liên kết. Đó là một mảng các đối tượng, mỗi đối tượng hơi giống một từ điển với hai khóa: "key" và "value".
Roman Starkov 8/07/2015

1
Những gì bạn có là một mảng chỉ được đặt tên là 'dict'.
Jan Kyu Peblik

2
Đánh giá cao bản cập nhật và theo dõi thêm thông tin.
Jacob

410
var dict = {};

dict['key'] = "testing";

console.log(dict);

hoạt động giống như con trăn :)

đầu ra giao diện điều khiển:

Object {key: "testing"} 

3
Đây chắc chắn là cách tiếp cận tốt nhất để xây dựng một từ điển và là câu trả lời chính xác!
La Mã

3
Rất quan trọng để khởi tạo với dấu ngoặc {}thay vì dấu ngoặc đơn
Jaider

Tôi cũng sử dụng các đối tượng cơ bản như từ điển như thế này. Vui mừng khi thấy đó là cách đúng đắn!
TKoL 2/2/2016

5
"Vẻ đẹp" của javascript! Đối tượng IS thực tế là một từ điển cặp giá trị chính
100r

1
@Azurespot khóa có thể là bất cứ thứ gì có thể băm, tất cả các khóa được sắp xếp theo hàm băm, điều này trong python3 khác nhau mỗi lần chạy.
Tcll

53

Nó đơn giản như:

var blah = {}; // make a new dictionary (empty)

hoặc là

var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 

sau đó

blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2

1
@KenEucker Tôi nghĩ thật hữu ích khi có câu trả lời sai trong các câu hỏi như thế này. Đặc biệt nếu ai đó giải thích tại sao họ sai, đó là một tài nguyên học tập tốt.
CJBrew

32

Vì bạn đã nói rằng bạn muốn một đối tượng từ điển ( chứ không phải là một mảng như tôi giả sử đã hiểu) Tôi nghĩ rằng đây là những gì bạn đang theo sau:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing

Giải pháp khác sử dụng .push vào một mảng hoạt động cho mục đích sử dụng của tôi, nhưng tôi cho rằng điều này cũng sẽ hoạt động nếu tôi đã thử nó.
KenEucker

2
Trừ khi tôi hiểu nhầm đối tượng Từ điển là gì, câu hỏi của bạn là sai lệch. Làm thế nào bạn sẽ lấy một giá trị theo khóa từ mảng của bạn?
ZenMaster

Tôi đang sử dụng JSON.opesify trên đối tượng này và sau đó bắt nó bằng bộ điều khiển trong MVC 3. Điều này chỉ để nó được định dạng đúng trước khi xâu chuỗi nó và gửi nó theo.
KenEucker

23

Của JavaScript Object của riêng mình như một cuốn từ điển. Không cần phải phát minh lại bánh xe.

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

Vĩ cầm


11

Bạn có thể sử dụng bản đồ với Map, như thế này:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');

9

Tôi tình cờ đi ngang qua câu hỏi này để tìm kiếm một cái gì đó tương tự. Nó cung cấp cho tôi đủ thông tin để chạy thử nghiệm để có câu trả lời tôi muốn. Vì vậy, nếu bất kỳ ai khác muốn biết cách tự động thêm hoặc tra cứu cặp {key: 'value'} trong một đối tượng JavaScript, bài kiểm tra này sẽ cho bạn biết tất cả những gì bạn có thể cần biết.

var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 =  'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';

console.log(dictionary[keyInitial]);

dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);

đầu ra

initialValue
{ initialkey: 'initialValue',
  something: 'value1',
  somethingElse: 'value2' }

2
Đây không phải là một câu hỏi. Thay vào đó, những gì bạn nên làm là đặt câu hỏi và sau đó tự trả lời. Điều đó sẽ dễ hiểu hơn nhiều và tổ chức.
SalmonKiller

1
cảm ơn @SalmonKiller tôi không chắc về thuật ngữ thích hợp để viết câu hỏi của riêng mình và hy vọng nó sẽ được hiểu nhưng sau đó tôi đã tình cờ tìm thấy nó trong tất cả các thông tin có ở đó nhưng tôi đã trả lời khái niệm của câu hỏi này theo cách đó sẽ trả lời nó cho một người khác vấp phải câu hỏi này đang tìm kiếm điều tương tự như tôi
user2301449

1
CƯỜI LỚN. Tôi đã xem xét điều này và nó giống như một câu hỏi thay vì một câu trả lời. Xin lỗi bạn!
SalmonKiller

Cảm ơn bạn đã thêm điều này. Bạn cũng có thể đặt nó vào một câu đố như câu trả lời ở trên.
KenEucker

8
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1

đối với một số hoạt động bổ sung, bạn nên tham khảo key1 = dictionary.key1chứ không phải là chỉ sốkey1 = dictionary["key1"]
Tcll

4

Bạn có thể tạo một Từ điển lớp để bạn có thể dễ dàng tương tác với danh sách Từ điển:

class Dictionary {
  constructor() {
    this.items = {};
  }
  has(key) {
    return key in this.items;
  }
  set(key,value) {
    this.items[key] = value;
  }
  delete(key) {
    if( this.has(key) ){
      delete this.items[key]
      return true;
    }
    return false;
  }
}

var d = new Dictionary();
d.set(1, "value1")
d.set(2, "value2")
d.set(3, "value3")
console.log(d.has(2));
d.delete(2);
console.log(d.has(2));


3

Làm thế nào về một lớp lót để tạo một cặp giá trị quan trọng?

let result = { ["foo"]: "some value" };

và một số hàm lặp như muốn reducetự động chuyển đổi một mảng thành từ điển

var options = [
  { key: "foo", value: 1 },
  { key: "bar", value: {id: 2, name: "two"} },
  { key: "baz", value: {["active"]: true} },
];

var result = options.reduce((accumulator, current) => {
  accumulator[current.key] = current.value;
  return accumulator;
}, {});

console.log(result);


3

Trong javascript hiện đại (ES6 / ES2015), người ta nên sử dụng cấu trúc dữ liệu Bản đồ cho từ điển. Cấu trúc dữ liệu Bản đồ trong ES6 cho phép bạn sử dụng các giá trị tùy ý làm khóa.

const map = new Map();
map.set("true", 1);
map.set("false", 0);

Trong bạn vẫn đang sử dụng ES5, cách chính xác để tạo từ điển là tạo đối tượng mà không cần nguyên mẫu theo cách sau.

var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;

Có nhiều lợi thế của việc tạo một từ điển mà không cần một đối tượng nguyên mẫu. Dưới đây blog đáng đọc về chủ đề này.

mô hình chính tả

đối tượng như bản đồ


2

Nó sẽ giúp rất nhiều để biết kết quả mong muốn cuối cùng của bạn là gì, nhưng tôi nghĩ đây là những gì bạn muốn:

var vars = [{key:"key", value:"value"}];

vars.push({key: "newkey", value: "newvalue"})

2

Tôi gặp vấn đề này .. nhưng trong vòng lặp for. Giải pháp hàng đầu không hoạt động (khi sử dụng biến (và không phải chuỗi) cho các tham số của hàm đẩy) và các giải pháp khác không tính đến các giá trị chính dựa trên các biến. Tôi đã rất ngạc nhiên khi cách tiếp cận này (vốn phổ biến trong php) đã hoạt động ..

  // example dict/json                  
  var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
    'record_identifier_2': {'content':'Some  different content','title':'Title of my another Record'} };

  var array = [];

  // key to reduce the 'record' to
  var reduceKey = 'title';

  for(key in iterateDict)
   // ultra-safe variable checking...
   if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
    // build element to new array key
     array[key]=iterateDict[key][reduceKey];

1

Một cải tiến var dict = {}là sử dụngvar dict = Object.create(null) .

Điều này sẽ tạo ra một đối tượng trống khôngObject.prototypenhư nguyên mẫu của nó.

var dict1 = {};
if (dict1["toString"]){
    console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
    console.log("This line won't run :)")
}

1

Mảng khởi tạo đầu tiên trên toàn cầu

var dict = []

Thêm đối tượng vào từ điển

dict.push(
     { key: "One",value: false},
     { key: "Two",value: false},
     { key: "Three",value: false});

Output : 
   [0: {key: "One", value: false}
    1: {key: "Two", value: false}
    2: {key: "Three", value: false}]

Cập nhật đối tượng từ điển

Object.keys(dict).map((index) => {        
  if (index == 1){
    dict[index].value = true
  }
});

Output : 
   [0: {key: "One", value: false},
    1: {key: "Two", value: true},
    2: {key: "Three", value: false}]

Xóa đối tượng khỏi từ điển

Object.keys(dict).map((index) => {              
      if (index == 2){
        dict.splice(index)
      }
    });

Output : 
    [0: {key: "One", value: false},
     1: {key: "Two", value: true}]
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.