我有一种情况需要访问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 ...可以在运行时构建
答案 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。我会重新考虑你的设计; - )