使用值而不是索引

时间:2015-12-16 20:11:13

标签: javascript jquery arrays object

我有一组数学运算符存储为对象。

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()。一些数字来自以文本形式读取并转换的变量。也可能存在需要连接的文本(非数字文本)。所以我需要将数学和文本分开并进行不同的评估。我认为个人方法最好。

3 个答案:

答案 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

&#13;
&#13;
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;
&#13;
&#13;