访问Mutidimension knockout数组,其中维度在运行时使用javascript已知

时间:2014-07-01 07:20:47

标签: javascript arrays jslint

我有一种情况需要访问multidimension knockout 坐标直到运行时才知道的数组。

可能的敲除数组(可以是运行时之前未知的任何一个)

self.customers[0]
self.customers[0][0]
self.customers[0][0][0]
self.customers[0][0][0][0]
self.customers[0][0][0][0][0]

我有一个代码,它在字符串文字中给出了数组合,如下所示

level = "[0]"
level = "[0][0]"
level = "[0][0][0]"
level = "[0][0][0][0]"
level = "[0][0][0][0][0]"

以下面的方式评估数组中的值

  arr = arr.concat(eval('self.customers()' + level));

我知道这是有效的,这是一个糟糕的方式。 JSlint说“eval是邪恶的”

>有没有更好的方法来访问数组self.customers()[i] [j [k] ...其中i,j,k ...可以在运行时构建

2 个答案:

答案 0 :(得分:0)

您可以创建一个辅助函数,该函数根据输入返回正确的级别。像这样的东西

var getLevel = function (arr, levels) {
    var retArr = arr(); 
    while(levels) {
        try {
            var currLvl = parseInt(levels.substring(1,2)); //get first level
            if (retArr) {
                retArr = retArr[currLvl]; //navigate to given level
            } else {
                //what happens if the array doesn't have enough levels?
            }
            levels = levels.substring(3); // go to next level
        } catch (ex) {
            console.log(ex);
            //what should happen if the levels string has a wrong format?
        }
    }

    return retArr;
}

当然,您还应该定义当输入无效或未定义时需要发生的事情。

然后你会这样调用这个方法:getLevel(self.customers, level);,从而避免使用eval:)

答案 1 :(得分:0)

这实际上不是与Knockout相关的问题。无论如何,有几种方法可以在不使用eval的情况下解决这个问题,有些方法比其他方法更聪明。这是一种直截了当(但不一定是最优雅)的方式。

假设:

var self = {
    customers: [[[1],[[2,3,4],5]],[6],[7,[8,9]]]
};

var level = "[0][1][0][2]";

预期输出为“4”。现在首先找到水平,例如使用正则表达式:

var myLevels = level.match(/\d+/g);

使用递归函数遍历多维数组:

function multiDimensionFind(data, levels) {
    var result = data[levels[0]];
    if (result instanceof Array) {
        levels.splice(0, 1);
        return multiDimensionFind(result, levels);
    }
    return result;
}

var x = multiDimensionFind(self.customers, myLevels);

请参阅this fiddle以了解相关信息。

PS。我会重新考虑你的设计; - )