我正在使用Code Canyon脚本Spin2Win(https://codecanyon.net/item/spin2win-wheel-spin-it-2-win-it/16337656),它使用本地JSON文件来创建段。
控制段的JSON文件部分具有以下格式。
"segmentValuesArray" : [
{"probability":10, "type": "string", "value": "$10^Coupon", "win": true, "resultText": "You won a $10 Coupon", "userData": {"score":0}},
{"probability":30, "type": "string", "value": "Lose", "win": false, "resultText": "Thank you for Playing", "userData": {"score":0}},
{"probability":5, "type": "string", "value": "$25^Coupon", "win": true, "resultText": "You won a $25 Coupon", "userData": {"score":0}},
{"probability":30, "type": "string", "value": "Lose", "win": false, "resultText": "Thank you for Playing", "userData": {"score":0}},
{"probability":2, "type": "string", "value": "Free Spin", "win": true, "resultText": "You Won a Free Spin", "userData": {"score":0}},
{"probability":30, "type": "string", "value": "Lose", "win": false, "resultText": "Thank you for Playing", "userData": {"score":0}},
{"probability":3, "type": "string", "value": "SWAG", "win": true, "resultText": "You won SWAG", "userData": {"score":0}},
{"probability":30, "type": "string", "value": "Lose", "win": false, "resultText": "Thank you for Playing", "userData": {"score":0}},
{"probability":1, "type": "string", "value": "GOOGLE^Home", "win": true, "resultText": "You won a Google Home", "userData": {"score":0}}
],
我的问题是我还有50美元和100美元的优惠券,其概率值会更低。但我在任何时候都只想要2个优惠券。所以我的想法是随机选择一个优惠券价值,然后在旋转脚本处理json之前使用find和replace来更新两个优惠券分段。
我已经测试过,我可以在segmentValueArrary中添加ID标签,如下所示:
{"id":"01", "probability":10, "type": "string", "value": "$10^Coupon", "win": true, "resultText": "You won a $10 Hosting Coupon", "userData": {"score":0}},
我找到了这个答案:JSON Object array inside array find and replace in javascript
但它只给出了如何替换一个值的示例,我需要替换概率,值和resultText任何尝试修改代码查找和替换代码都失败了。
*****更新#1 *****
我玩了一些代码并开始在Jsfiddle工作。 (http://jsfiddle.net/6347s9bo/)
我现在遇到的问题是开发人员如何加载和处理JSON。这是他的代码
loadJSON(function(response) {
// Parse JSON string to an object
var jsonData = JSON.parse(response);
........
这是他的loadJSON函数
function loadJSON(callback) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open('GET', './wheel_data.json', true);
xobj.onreadystatechange = function() {
if (xobj.readyState == 4 && xobj.status == "200") {
//Call the anonymous function (callback) passing in the response
callback(xobj.responseText);
}
};
xobj.send(null);
}
我现在得到的错误是object.map不是一个函数。我在他的JSON.parse调用之后放置了我的findAndReplace()调用,它应该将文本转换为对象。
不确定我缺少什么
答案 0 :(得分:0)
function changeAttributes(objArray, objId, probability, value, resultText) {
objArray.forEach(function(obj) {
if (obj.id === objId) {
obj.probability= probability;
obj.value = value;
obj.resultText = resultText;
}
});
}
objId是要替换的Array中对象的Id。 3个值是您要设置的新值。 你必须调用该方法2次,每次使用一次优惠券来替换属性。
答案 1 :(得分:0)
不确定完全理解您的问题。 JSON基本上是一个javascript数组。因此更新它不需要将其转换为字符串。在数组中查找值非常简单。在您的情况下,只需创建一个这样的函数:
function isCoupon(item) {
return item.id === '01';
}
然后像这样搜索:
arrayItem = segmentValuesArray.find(isCoupon);
arrayItem.value.replace('10^','100^');
答案 2 :(得分:0)
所以我会迭代列表并相应地改变优惠券。您将不得不添加额外的逻辑来处理选择随机选择哪个优惠券,但我认为这给了一个起点。
segmentValuesArray.forEach(segment => {
if (segment.value.includes("Coupon")) {
segment.probability = 0;
segment.resultText = '';
}
});
参考包括:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
关于forEach的参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach