2015-02-08 50 views
1

我正在使用Javascript並希望將對象路徑傳遞給函數並更新對象。爲什麼不更新對象?並且除了返回之外還有一個很好的方法來讓它起作用,或者除了將整個對象傳遞給函數並在其中指定路徑之外呢? THX將Javascript路徑對象路徑導入函數並更新對象

var stock={ 
    basket:{ 
     apple:3, 
     orange:2 
    }, 
    table:{ 
     apple:5, 
     orange:5 
    } 
}; 
function change(path, amount){ 
    path+=amount; 
} 

// calling function 
change (stock.table.apple,-2); 
console.log(stock.table.apple); 
+0

調用「更改」功能後,stock.table.apple應該更新爲3,但它沒有更新,仍然顯示5。 – WABBIT0111 2015-02-08 18:37:10

回答

0

的問題是,stock.table.apple不是參考。它是價值5。因此:

change(stock.table.apple, -2) 
= change(5,     -2) 

    path = 5 
    amount = -2 

    path += amount 

     path = 3 
     amount = -2 

正如你所看到的,path += amount改變的path的價值,而不是stock.table.apple值。

之一來解決此方法如下:

var stock = { 
 
    basket: { 
 
     apple: 3, 
 
     orange: 2 
 
    }, 
 
    table: { 
 
     apple: 5, 
 
     orange: 5 
 
    } 
 
}; 
 

 
function change(object, key, amount) { 
 
    object[key] += amount; 
 
} 
 

 
change(stock.table, "apple", -2); 
 

 
alert(stock.table.apple);

上面的代碼工作,因爲stock.table是一個參考值。以下的答案將會有助於你理解的參考值和原始值之間的差異:

Primitive value vs Reference value

希望有所幫助。

+0

這工作現在完美。謝謝。 – WABBIT0111 2015-02-09 22:28:01

0
function change(path, amount){ 
    var key = Object.keys(path)[0]; 
    path[key] += amount; 
} 

// calling function 
change (stock.table,-2); 
console.log(stock.table.apple); 

您可以更新

+0

像Object.keys(path)[0]這樣的破解不是一個很好的解決方案。你不應該依賴於對象的鍵順序:http://stackoverflow.com/q/9179680/783743 – 2015-02-08 18:53:54

+0

很好的答案。謝謝 – WABBIT0111 2015-02-09 23:47:20

0

只發送一部分。這是一個棘手的。您使用存儲在stock.table.apple中的值調用change函數,而不是實際路徑。

您的函數調用是change(5, -2)

可以傳遞一個對象引用+路徑作爲字符串:

change(stock, "table.apple", -2) // look for attributes of the stock object 

或整個路徑爲一個字符串,如:

change("stock.table.apple", -2) // look for attributes of the window object 
+0

這是一個很好的答案。謝謝 – WABBIT0111 2015-02-09 23:44:39