我需要按字符串构建对象字符串,然后使用eval()创建对象。
我使用一组对象成功完成了这项工作,但下一部分是一个对象,它无效。
这三个jsFiddles显示了进展:
Chart with normal array (pieData) and object (pieOptions)
Chart with array formed of strings - works
Add object formed of strings - no work
对于我使用eval()
的原因进行了大量讨论。分别用于数据和选项的数组和对象都是逐位形成的字符串,然后一起形成一个数组和一个对象。这个jsFiddle将演示我的问题的一个(更简单)版本:
http://jsfiddle.net/81fpdc44/3/
请告诉我如何在不使用eval()
的情况下将s1 ... s5转换为数组。我错过了一些(不是一种不常见的情况......)?
对于后人:代码
工作(数组):
<canvas id="pieChart" height="400" width="300"></canvas>
pieD = '{value:25, color:"red"},';
pieD += '{value:5, color:"blue"},';
pieD += '{value:25, color:"palegreen"},';
pieD += '{value:10, color:"darkcyan"},';
pieD += '{value:35, color:"wheat"}';
eval('pieData = ['+pieD+']');
var pieOptions = {
annotateDisplay : true,
segmentShowStroke : false,
segmentStrokeColor : "white",
segmentStrokeWidth : 1,
percentageInnerCutout : 0,
animation: false,
animationSteps : 100,
animationEasing : "easeOutQuart",
animateRotate : true,
animateScale : false,
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
};
var ctx = document.getElementById("pieChart").getContext("2d");
var myPieChart = new Chart(ctx).Pie(pieData,pieOptions);
不工作:
pieO = 'annotateDisplay : true,';
pieO += 'segmentShowStroke : false,';
pieO += 'segmentStrokeColor : "white",';
pieO += 'segmentStrokeWidth : 1,';
pieO += 'percentageInnerCutout : 0,';
pieO += 'animation: false,';
pieO += 'animationSteps : 100,';
pieO += 'animationEasing : "easeOutQuart",';
pieO += 'animateRotate : true,';
pieO += 'animateScale : false,';
pieO += 'legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"';
eval('pieOptions = {'+pieO+'}');
答案 0 :(得分:2)
是的......当一个人终于看到解决方案时,它看起来很容易......而且因为没有尽快看到它而感到太愚蠢......
关键是要理解在任何情况下都不得使用eval()
。 (目前的技能水平,至少)
除了ajax注入和javascript代码注入之外,这就是我想要做的事情。我在变量中有这些值:
cu = 3;
py = 5;
fs = 7;
qz = 9;
ch = 11;
am = 13;
mi = 15;
mo = 17;
我必须创建一个部分文本/部分变量的数组(我想......)。所以,我试过这个:
pDat = ['{value:'+cu+'}, {value:'+py+'}, {value:'+fs+'}, {value:'+qz+'}, {value:'+ch+'}, {value:'+am+'}, {value:'+mi+'}, {value:'+mo+'}'];
那不起作用。所以我试过了:
eval('pDat = [{value:'+cu+'}, {value:'+py+'}, {value:'+fs+'}, {value:'+qz+'}, {value:'+ch+'}, {value:'+am+'}, {value:'+mi+'}, {value:'+mo+'}']');
适用于数组,但不适用于对象。
根据Vohuman,guest271314,epascarello和其他好人的好建议,我回到绘图板并重构代码,以便我可以这样做:
(它适用于所有事情 - 我甚至可以使用颜色代码添加变量):
pDat = [{value:cu, color:CuCol}, {value:py, color:PyCol}, {value:fs, color:FsCol}, {value:qz, color:QzCol}, {value:ch, color:ChCol}, {value:am, color:AmCol}, {value:mi, color:MiCol}, {value:mo, color:MOCol}];
oOpt = {
annotateDisplay : true,
segmentShowStroke : false,
segmentStrokeColor : "white",
segmentStrokeWidth : 1,
percentageInnerCutout : 0,
animation: false,
animationSteps : 100,
animationEasing : "easeOutQuart",
animateRotate : true,
animateScale : false,
legendTemplate : '<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'
};
var ctx = document.getElementById("pieChart").getContext("2d");
updateChart(ctx,pDat,pOpt,true,false);
注意:
FWIW,CuCol
,PyCol
等只是看起来像这样的变种:
CuCol = '#ffe382';
PyCol = '#1bb3a5';
etc
答案 1 :(得分:1)
您正在使用eval
创建对象数组:
s1 = '{value:25, color:"red"}';
s2 = '{value:5, color:"blue"}';
s3 = '{value:25, color:"palegreen"}';
s4 = '{value:10, color:"darkcyan"}';
s5 = '{value:35, color:"wheat"}';
var pieData = [ s1+s2+s3+s4+s5 ];
上面的代码片段是一种错误的方法。在这里,当您需要一个真实对象时,不应该创建对象的字符串表示(那些不是有效的JSON字符串)。你应该做的是:
var s1 = {value:25, color:"red"};
var s2 = {value:5, color:"blue"};
var s3 = {value:25, color:"palegreen"};
var s4 = {value:10, color:"darkcyan"};
var s5 = {value:35, color:"wheat"};
var pieData = [ s1, s2, s3, s4, s5 ];
现在pieData
是一个对象数组。完成!
答案 2 :(得分:1)
注意,将for i, col in enumerate(y.columns.tolist(), 1):
y.loc[:, col] *= i
y = y.sum(axis=1)
字符串属性的双引号调整为单引号。
尝试使用<ul>
,String.prototype.split()
,Array.prototype.map()
与String.prototype.replace()
RegExp
匹配字符az不区分大小写后跟空格字符或冒号字符{{1}对象字符串的属性; /(^[a-zA-Z]+)(?=\s|:)/g
,":"
JSON.stringify()
&#13;