带引用的String到Object

时间:2016-12-16 20:30:54

标签: javascript

当字符串中有引用时,如何将字符串转换为对象?

字符串:

  

{“field”:“OrderNumber”,“operator”:“eq”,“value”:   e.data.OrderNumber}

我已经尝试过使用JSON.parse和eval,但我仍然在“e.data.OrderNumber”上收到错误

5 个答案:

答案 0 :(得分:2)

由于对象属性引用,您必须使用eval或new Function才能使用eval或new函数,因为它是无效的JSON。新功能和评估存在安全问题,因此这个解决方案不是最佳选择。

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} );

答案 1 :(得分: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函数,this使用e设置为Function.prototype.bind()。如果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);对象。

jbzoo/utils

答案 2 :(得分:1)

https://jsfiddle.net/hd3v29ra/2/

当您将订单号插入要转换为对象的字符串时,您只需调整订单号以驻留在引号内:

示例1使用连接字符串

var obj = JSON.parse('{"field": "OrderNumber","operator": "eq","value":"' + e.data.orderNumber + '"}');

示例2使用ES6模板文字

var obj = JSON.parse(`{"field": "OrderNumber", "operator":"eq","value":"${e.data.orderNumber}"}`);

答案 3 :(得分:0)

有不安全和邪恶的eval

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

不要将此与不受信任的字符串一起使用,它可能会运行任意代码。

答案 4 :(得分: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))来调用方法