Javascript查询2d数组

时间:2014-07-15 17:12:55

标签: javascript multidimensional-array

以下是我桌子的一小部分样本。我将收集用户数据,并返回一个费率。是否有库或模块来执行此类查询,或者我是否必须手动编写某些内容?因此,如果我的用户是23,goodDriver,没有房屋保险,那么房价应该回到2.00。这需要在客户端,并在Chrome,FF,Safari和IE 9中工作。感谢

        var rateTable = [
        ["lowerAge", "upperAge", "goodDriver", "hasHomeInsurance",    "rate"],
        ["20",      "30",         true,         true,                1.00],
        ["20",      "30",         true,         false,               2.00],
        ["20",       "30",        false,        true,                3.00],
        ["20",       "30",        false,        false,               4.00]
    ]

2 个答案:

答案 0 :(得分:1)

您希望重新构建数据,以便拥有一组对象,这样可以更轻松地运行简单查询。

var rateTable = [
    ["lowerAge", "upperAge", "goodDriver", "hasHomeInsurance",    "rate"],
    ["20",      "30",         true,         true,                1.00],
    ["20",      "30",         true,         false,               2.00],
    ["20",       "30",        false,        true,                3.00],
    ["20",       "30",        false,        false,               4.00]
];

var rates = [{
    lowerAge: "20",
    upperAge: "30",
    goodDriver: true,
    hasHomeInsurance: true,
    rate: 1.00,
}, {
    lowerAge: "20",
    upperAge: "30",
    goodDriver: true,
    hasHomeInsurance: false,
    rate: 2.00,
}, {
    lowerAge: "20",
    upperAge: "30",
    goodDriver: false,
    hasHomeInsurance: true,
    rate: 3.00,
}, {
    lowerAge: "20",
    upperAge: "30",
    goodDriver: false,
    hasHomeInsurance: false,
    rate: 4.00,
}];

如果您事先无法进行转换,请参阅以下内容:

var rates = rateTable.slice(1).map(function (row) {
    return this.reduce(function (obj, key, index) {
        obj[key] = row[index];
        return obj;
    }, {});
}, rateTable[0]);

至于转换后查询数据,这里有一个例子:

function getRate(age, goodDriver, hasHomeInsurance) {
    var rate = rates.find(function (rate) {
        return age >= rate.lowerAge &&
            age <= rate.upperAge &&
            rate.goodDriver === goodDriver &&
            rate.hasHomeInsurance == hasHomeInsurance;
    });
    return rate && rate.rate;
}

编辑:我应该补充一点,Array.prototype.find并不是在任何地方都支持,但可以用一个简单的循环代替。请参阅this问题。

答案 1 :(得分:0)

正如其他人所说,我强烈建议您使用mySQL 。但是,你有一个对我来说很有趣的问题,所以我试着解决它。

这不是最有效的方法,但你去了。

您可以遍历数组中的每一行,并检查所有值是否与您要检查的值相对应。

该功能可以这样工作:

function getRate(){
    // get all the values
    var age = parseInt($('#age').val());
    var goodDriver = $('input[name="goodDriver"]:eq(1)').is(':checked');
    var insurance = $('input[name="insurance"]:eq(1)').is(':checked');

    // check each row for a match
    for(var i=0; i<rateTable.length; i++){
        var row = rateTable[i];
        // if one is found, return the rate
        if (row[0]<=age && row[1]>=age && row[2]==goodDriver && row[3]==insurance)
            return row[4];
    }

    // if no match was found
    return false;
}

JS Fiddle Demo

注意

我删除了表格中age周围的引号,将它们作为整数进行比较。