我想動態訪問物件的屬性及其值,場景是:
const SoldeN = {
1:4,
}
const SoldeN_1 = {
2:5,
}
const soldes = [
{ formula: '=SoldeN("1")',value:0},
{ formula: '=SoldeN_1("2")',value:0},
{ formula: '=SoldeN_1("1") SoldeN_1("2")',value:0},
];
到目前為止我嘗試過的:
const getProperty = string => string.match(/\(.*?\)/g).map(x => x.replace(/[(")]/g, ''))
const getObject = string => string.match(/[= ](.*?)\(/g).map(x => x.replace(/[=( ]/g, ''))
console.log(soldes.map(solde=>[getObject(solde.formula),getProperty(solde.formula)]))
[
[["SoldeN"], ["1"]],
[["SoldeN_1"], ["2"]],
[
["SoldeN_1", "SoldeN_1"],
["1", "2"],
],
];
到目前為止一切正常,但是為了根據屬性動態獲取物件的值,我使用了這個函式:
const getPropertyValue = (obj, prop) => obj[prop];
getPropertyValue('SoldeN','1')
//'o'
它給了我'o'而不是1,我知道如果我傳遞了一個物件的參考,它會帶來它的價值;但要動態獲取它,我必須傳遞字串物件的實際名稱,而不是物件參考。預期的結果是:
result = [
{ formula: '=SoldeN("1")',value:4},
{ formula: '=SoldeN_1("2")',value:5},
{ formula: '=SoldeN_1("1") SoldeN_1("2")',value:9},
];
uj5u.com熱心網友回復:
為什么不將資料放在物件中并將資料映射到回圈中?完全沒有必要使用eval。
const data = {
SoldeN: {
1: 4,
},
SoldeN_1: {
2: 5,
},
};
const soldes = [
{ formula: '=SoldeN("1")', value: 0 },
{ formula: '=SoldeN_1("2")', value: 0 },
{ formula: '=SoldeN("1") SoldeN_1("2")', value: 0 },
];
const getProperty = string =>
string.match(/\(.*?\)/g).map(x => x.replace(/[(")]/g, ""));
const getObject = string =>
string.match(/[= ](.*?)\(/g).map(x => x.replace(/[=( ]/g, ""));
const output = soldes.map(solde => {
const objs = getObject(solde.formula);
const props = getProperty(solde.formula);
const newVal = objs.reduce((carry, item, idx) => {
carry = data[item][props[idx]];
return carry;
}, solde.value);
return {
...solde,
value: newVal,
};
});
console.log(output);
uj5u.com熱心網友回復:
您可以評估物件名稱。
const SoldeN = { 1:4 };
const getPropertyValue = (obj, prop) => eval(obj)[prop];
console.log(getPropertyValue('SoldeN','1'));
但要小心,因為它有風險!如果錯誤的代碼可以進入eval爭論,事情就會發生。
uj5u.com熱心網友回復:
您可以使用 javascripteval方法來執行運算式。
邏輯
- 回圈遍歷 中的節點
soldes。 - 全部替換
"="為空字串。"("用"["和")"用"]"。 - 這將使運算式
=SoldeN("1") SoldeN_1("2")變為SoldeN["1"] SoldeN_1["2"]. - 評估這會給你預期的結果。
const SoldeN = {
1: 4,
};
const SoldeN_1 = {
2: 5,
};
const soldes = [
{ formula: '=SoldeN("1")', value: 0 },
{ formula: '=SoldeN_1("2")', value: 0 },
{ formula: '=SoldeN("1") SoldeN_1("2")', value: 0 },
];
const getValue = (formula) => eval(formula.replaceAll("=", "").replaceAll("(", "[").replaceAll(")", "]"));
const result = soldes.map((item) => ({
formula: item.formula,
value: getValue(item.formula)
}));
console.log(result);
請注意錯誤處理被視為超出范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/396627.html
標籤:javascript 数组 正则表达式 目的
上一篇:嘗試從字串列中的點之間提取字串值
