我有一组数学运算符存储为对象。
object {0: "-", 1: "*", 2: "/", 3: "+"} called numOperators
我不知道操作符的顺序,但是它们需要以*,/,+和 - 的正确顺序执行。所以当我将上述对象重新分配到另一个并行对象时,我使用需要执行的顺序分配上述对象的索引。然后我有这个对象:
Object {0: 2, 1: 0, 2: 1, 3: 3} called opArray
我想要做的是通过查看值而不是索引来遍历对象(可以是任何长度)。
总之,我希望以3,2,1,0的顺序迭代所有值。查找值3,直到用完,然后查找2,然后查找1,最后查看0。我还没有能够想出一个有效的方法来做到这一点。由于数学运算符需要按顺序完成,因此会创建临时结果值,然后将其用于下一次迭代。最终,它们都被合并为一个结果。
这就是我上次尝试的内容:
var valArray = {0: "3", 1: "8", 2: "4", 3: "8", 4: "2"};
var res=[];//temporary result values ordered by execution
var returnRes=0;
var op=0;
$.each(opArr, function(index, value) {//goes through the values in order
if(value==0){
op = numOperators[index]; //uses the indexes that matches the values
res[index]=operate(valArr[index], valArr[index+1],op);
returnRes=res[index];
console.log(res);
}
if(valuei>0){
op = numOperators[index];
res[index]=operate(res[index-1], valArr[index+1],op);
returnRes=res[index];
console.log(res);
}
});
return(returnRes);
我知道我可能会以完全错误的方式解决这个问题,所以我很欣赏一些关于什么是更简单的方法的见解。谢谢!
为了进一步澄清,我有充分的理由将这种方法用于数学而不使用eval()。一些数字来自以文本形式读取并转换的变量。也可能存在需要连接的文本(非数字文本)。所以我需要将数学和文本分开并进行不同的评估。我认为个人方法最好。
答案 0 :(得分:0)
明显的解决方案似乎是为每个循环使用a。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in
您可以做的另一件事以及更接近您的用例的是为此编写迭代器。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators
答案 1 :(得分:0)
你可以创建一个数组并按值排序:
var opArray = {0: 2, 1: 0, 2: 1, 3: 3};
var array = [];
for (var key in opArray) {
array.push({
key: key,
value: opArray[key]
});
}
array.sort(function(a, b) {
return a.value < b.value;
});
console.log(JSON.stringify(array));
// will print
//[
// {"key":"3","value":3},
// {"key":"0","value":2},
// {"key":"2","value":1},
// {"key":"1","value":0}
//]
// So now you can iterate over the array in the correct order
// and access the key and value properties
答案 2 :(得分:0)
为什么不使用普通数组:
var numOperators = ["-", "*", "/", "+"];
访问是通过
numOperators.forEach(function (operator) {
// do something
});
可能的。
示例强>
8 * 4,结果/ 8,3-结果,结果+ 2
var operators = ['*', '/', '-', '+'],
functions = {
'-': function (a, b) { return b - a; }, // spot the changed variables
'*': function (a, b) { return a * b; },
'/': function (a, b) { return a / b; },
'+': function (a, b) { return a + b; }
},
valArray = [8, 4, 8, 3, 2];
document.write(valArray.reduce(function (r, a, i) {
return functions[operators[i]](r, a);
}, valArray.shift()));
&#13;