簡體   English   中英

將鍵值對添加到key為對象的javascript對象

[英]Adding key-value pair to javascript object where key is an object

1)我試圖將一系列鍵值對添加到JS普通對象,其中鍵本身是一個對象。 每次添加鍵值對時,對象都會被覆蓋(請參見此處 )。

var x = {};

var y = {
  'name': 'cat',
  'note': 'lazy animal'
}
var yy = 'meow'

x[{
  'name': 'dog',
  'note': 'loyal animal'
}] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台輸出:

"[object Object]"
"meow"

2)當密鑰是字符串時,不會發生這種(覆蓋行為)(請參見此處 )。

var x = {};

var y = 'cat'
var yy = 'meow'

x['dog'] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台輸出:

"dog"
"bhow"
"cat"
"meow"

想了解為什么會發生這種情況?

我通過其他問題( 這里 )找出了一些解決方案。 但我無法理解這里的概念。 任何指導將不勝感激。

對象鍵必須是字符串(或符號),因此當您嘗試將對象用作鍵時,它首先將其轉換為字符串表示形式,您已經看到它是"[object Object]"

但是,您可以通過覆蓋對象上的toString函數來執行您希望執行的操作,並且只要為每個對象返回唯一字符串(可能作為對象內容的哈希值),您的代碼將按預期工作,因為它將使用該toString函數來獲取對象的字符串表示形式,並將其用作鍵:

 var x = {}; var y = { 'name': 'cat', 'note': 'lazy animal', toString: function() { return 'yobj'; } }; var yy = 'meow'; x[{ 'name': 'dog', 'note': 'loyal animal', toString: function() { return 'xobj'; } }] = 'bhow'; x[y] = yy; for (var k in x) { console.log(k); console.log(x[k]); } 


正如Jared在他的評論中提到的那樣, Map對象(去年在ES6中引入)部分旨在解決這個問題,並允許您直接使用對象作為您的密鑰,如果您在支持其使用環境中運行。

你傳遞的東西的對象(的屬性訪問任何時候object[...]語法),它被轉換為字符串(見這里在“屬性名稱”)。

像您正在使用的那些簡單的Javascript對象使用默認的toString()方法對字符串進行類型轉換, 方法只返回"[object Object]" 這就是為什么他們最終都指向相同的價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM