2016-12-16 100 views
1

如何在字符串內有引用時將字符串轉換爲對象?字符串與參考對象

字符串:

{ 「場」: 「訂單號碼」, 「經營者」: 「EQ」, 「價值」: e.data.OrderNumber}

我已經嘗試過用JSON.parse和eval,但我仍對「e.data.OrderNumber」得到一個錯誤

+0

'obj.value = e.data.OrderNumber' – Mahi

+6

這不是有效的JSON。 'e.data.OrderNumber'應該被視爲一個像這樣的字符串:'「e.data.OrderNumber」' –

回答

2

套裝"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);

+0

如果字符串事先知道,可以使用對象初始值設定項代替字符串。 – Oriol

+0

@Oriol是的,雖然問題的實際文本是_「帶有refence的對象的字符串」_ – guest271314

+0

@LucianoMeireles查看更新的帖子。 – guest271314

0

有不安全和邪惡eval

var e = {data: {OrderNumber: 123}}; 
 
var str = '{ "field": "OrderNumber", "operator": "eq", "value" : e.data.OrderNumber }'; 
 
console.log(eval('(' + str + ')'));

不要與不可信的字符串使用,它可以運行任意代碼。

+0

但數據值不會是OrderNumber,我將使用這個字符串作爲過濾器上下文:filter:JSON。解析(relationString) –

+0

@LucianoMeireles那麼,什麼?這將仍然有效。 – Oriol

2

只有真正的選項,你必須使用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}); 
+0

爲什麼'新功能'而不只是'eval'? – Evert

+0

@Evert個人喜好? – epascarello

+0

但數據值不會是OrderNumber,我將使用此字符串作爲過濾器上下文:filter:JSON.parse(relationString) –

1

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}"}`); 
+0

但數據值不會是OrderNumber,我將使用此字符串作爲過濾器上下文:filter:JSON.parse(relationString) –

0

它與這工作:

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))來調用方法

+0

當前Answer中的'javascript'與第一個stacksnippet處的'javascript'完全相同本答案http://stackoverflow.com/a/41192130/ – guest271314