如何在字符串內有引用時將字符串轉換爲對象?字符串與參考對象
字符串:
{ 「場」: 「訂單號碼」, 「經營者」: 「EQ」, 「價值」: e.data.OrderNumber}
我已經嘗試過用JSON.parse和eval,但我仍對「e.data.OrderNumber」得到一個錯誤
如何在字符串內有引用時將字符串轉換爲對象?字符串與參考對象
字符串:
{ 「場」: 「訂單號碼」, 「經營者」: 「EQ」, 「價值」: e.data.OrderNumber}
我已經嘗試過用JSON.parse和eval,但我仍對「e.data.OrderNumber」得到一個錯誤
套裝"value"
空字符串。請致電JSON.parse()
並將str
作爲參數。設置結果對象的.value
。
var str = `{"field":"OrderNumber","operator":"eq","value":""}`;
var obj = JSON.parse(str);
obj.value = e.data.OrderNumber;
一種替代方法將是利用JSON.parse()
reviver
功能,在使用Function.prototype.bind()
this
集到e
。如果key
等於"value"
範圍內的函數,則創建一個變量val
,其中值初始設置爲undefined
。使用.split()
在key
"value"
內創建一組屬性表示。 .slice()
來自結果數組的0
之後的索引。使用for..of
循環獲取obj[arrayIndex]
到obj[arrayIndex][propN]
的值,其中propN
是數組的第n個索引;將值分配給變量val
。循環後返回變量val
,否則返回value
參數。
var e = {
data: {
OrderNumber: 1
}
};
var str = '{"field":"OrderNumber","operator":"eq","value":e.data.OrderNumber}';
str = str.replace(/((\w+.[\w.]+)(?=(\s+|)\}))/g, "\"$1\"");
var rev = function(key, value) {
if (key === "value") {
let [props, val] = [value.split(".").slice(1), void 0];
for (let prop of props) {
val = val === undefined ? this[prop] : val[prop];
}
return val;
}
return value;
};
var obj = JSON.parse(str, rev.bind(e));
console.log(obj);
您還可以檢索和設置值,而無需使用String.prototype.replace()
與RegExp
/((\w+.[\w.]+)(?=(\s+|)\}))/g
匹配單詞字符後跟.
隨後的多個單詞字符一個字符.
具有屬性的名稱; String.prototype.match()
匹配單詞字符並從匹配項創建數組; Array.prototype.reduce()
來迭代陣列的.length
的對象屬性的每個深度,返回對應於原始字符串內的對象屬性的陣列.length
的深度的最後一個值。
const e = {
data: {
OrderNumber: 1
}
};
let str = '{ "field": "OrderNumber", "operator": "eq", "value" : e.data.OrderNumber }';
str = str.replace(/((\w+.[\w.]+)(?=(\s+|)\}))/g, function(match) {
let [,...props] = match.match(/[^.]+/g);
return props.reduce(function(obj, prop) {
return obj[prop]
}, e);
});
let obj = JSON.parse(str);
console.log(obj);
,導致對原始字符串從調用數組.match()
,.shift()
,.split()
可以從e
與解構賦值得到的屬性值;使用.replace()
設置替換字符串,其對應值爲e
;然後調用JSON.parse()
並將結果字符串作爲值來創建javascript
對象。
const e = {
data: {
OrderNumber: 1
}
};
let str = '{ "field": "OrderNumber", "operator": "eq", "value" : e.data.OrderNumber }';
let re = /((\w+.[\w.]+)(?=(\s+|)\}))/g;
let obj = JSON.parse(str.replace(re
, (() => ([,...props] = str.match(re).shift().split(".")
, {[props[0]]:{[props[1]]:prop}} = e, prop)
)()
));
console.log(obj);
如果字符串事先知道,可以使用對象初始值設定項代替字符串。 – Oriol
@Oriol是的,雖然問題的實際文本是_「帶有refence的對象的字符串」_ – guest271314
@LucianoMeireles查看更新的帖子。 – guest271314
有不安全和邪惡eval
:
var e = {data: {OrderNumber: 123}};
var str = '{ "field": "OrderNumber", "operator": "eq", "value" : e.data.OrderNumber }';
console.log(eval('(' + str + ')'));
不要與不可信的字符串使用,它可以運行任意代碼。
但數據值不會是OrderNumber,我將使用這個字符串作爲過濾器上下文:filter:JSON。解析(relationString) –
@LucianoMeireles那麼,什麼?這將仍然有效。 – Oriol
只有真正的選項,你必須使用eval或new函數,因爲你有什麼是由於對象屬性引用無效的JSON。新的Function和eval有安全問題,所以這個解決方案不是最好的主意。
var str = '{ "field": "OrderNumber", "operator": "eq", "value" : e.data.OrderNumber }';
var e = { data : { OrderNumber : 123456 } };
var x = new Function("return " + str)();
console.log(x.value);
,但如果我是你,我會看看是否有更好的方法做,你需要,而不是使用創可貼來解決這個問題是什麼。我會做的是有一個對象,並添加屬性或擴展它。
var e = { data : { OrderNumber : 123456 } };
var obj = { "field": "OrderNumber", "operator": "eq" };
obj.value = e.data.OrderNumber;
或
var e = { data : { OrderNumber : 123456 } };
var obj = { "field": "OrderNumber", "operator": "eq" };
var result = {};
Object.assign(result, obj, {value : e.data.OrderNumber});
爲什麼'新功能'而不只是'eval'? – Evert
@Evert個人喜好? – epascarello
但數據值不會是OrderNumber,我將使用此字符串作爲過濾器上下文:filter:JSON.parse(relationString) –
https://jsfiddle.net/hd3v29ra/2/
只需將需要調整訂單號駐留報價中,當你將其插入到字符串轉換成一個對象:
例子1使用級聯字符串
var obj = JSON.parse('{"field": "OrderNumber","operator": "eq","value":"' + e.data.orderNumber + '"}');
使用ES6模板字面
例如2
var obj = JSON.parse(`{"field": "OrderNumber", "operator":"eq","value":"${e.data.orderNumber}"}`);
但數據值不會是OrderNumber,我將使用此字符串作爲過濾器上下文:filter:JSON.parse(relationString) –
它與這工作:
private static rev(key: any, value: any): any {
if (key === "value") {
let [props, val] = [value.split(".").slice(1), void 0];
for (let prop of props) {
val = val === undefined ? this[prop] : val[prop];
}
return val;
}
return value;
}
我用JSON.parse(relationString,this.rev.bind(E))來調用方法
當前Answer中的'javascript'與第一個stacksnippet處的'javascript'完全相同本答案http://stackoverflow.com/a/41192130/ – guest271314
'obj.value = e.data.OrderNumber' – Mahi
這不是有效的JSON。 'e.data.OrderNumber'應該被視爲一個像這樣的字符串:'「e.data.OrderNumber」' –