首先,讓我們的程序包括三個小助手功能:
// exprToDict("3x + y") -> {x:3, y:1}
function exprToDict(e) {
var d = {};
e.replace(/(\d+)\s*(\w+)|(\w+)/g, function($0, $1, $2, $3) {
d[$2 || $3] = parseInt($1 || 1);
});
return d;
}
// addDicts({x:1, y:2}, {x:100, y:3}) -> {x:101, y:5}
function addDicts(a, b) {
var d = {};
for(var x in a) d[x] = a[x];
for(var x in b) d[x] = (d[x] || 0) + b[x];
return d;
}
// dictToExpr({x:1, y:2}) -> x + (2 y)
function dictToExpr(d) {
var e = [];
for(var x in d)
if(d[x] == 1)
e.push(x);
else
e.push("(" + d[x] + " " + x + ")");
return e.join(" + ")
}
一旦我們得到了,我們已經準備好代碼的主要功能:
function addThings(a, b) {
return dictToExpr(
addDicts(
exprToDict(a),
exprToDict(b)
))
}
測試一下:
sword = "(3 wood) + diamond"
pickaxe = "wood + (2 diamond)"
console.log(addThings(sword, pickaxe))
結果:
(4 wood) + (3 diamond)
爲了處理兩個以上的東西,修改addDicts
接受數組:
function addDicts(dicts) {
var sum = {};
dicts.forEach(function(d) {
for(var x in d)
sum[x] = (sum[x] || 0) + d[x];
});
return sum;
}
和重寫addThings
爲:
function addThings(things) {
return dictToExpr(
addDicts(
things.map(exprToDict)));
}
實施例:
sword = "(3 wood) + diamond"
pickaxe = "wood + (2 diamond)"
house = "10 wood + iron"
console.log(addThings([sword, pickaxe, house]))
謝謝,但我無法將其實現到我的代碼中,它不會將值返回到我的HTML頁面。其次,這種支持是否表示,如果是由3件事情產生的東西,而不是2件,並且如果有2件以上的東西需要添加,謝謝,好的邏輯,這似乎是一個相當合理的方法 – VikeStep
我得到這個錯誤 Uncaught TypeError:無法調用未定義網站的方法'替換' – VikeStep
@VikeStep:關於超過2件事情 - 請參閱更新後的答案。 – georg