【问题标题】:Can I select 2nd element of a 2 dimensional array by value of the first element in Javascript?我可以通过Javascript中第一个元素的值选择二维数组的第二个元素吗?
【发布时间】:2012-06-12 17:59:44
【问题描述】:

我有一个这样的 JSON 响应:

 var errorLog = "[[\"comp\",\"Please add company name!\"],
                 [\"zip\",\"Please add zip code!\"],
                  ...

我是这样反序列化的:

 var log = jQuery.parseJSON(errorLog);

现在我可以访问这样的元素:

 log[1][1] > "Please add company name"

问题
如果我有第一个值 comp,有没有办法通过这样做直接获得第二个值:

 log[comp][1]

不循环整个数组。

感谢您的帮助!

【问题讨论】:

  • 我越来越不确定了。我尝试使用 toLowerCase() 而没有
  • 你能把数组改成对象吗?
  • @SLaks: 不,这与客户端和服务器端的许多事情有关
  • comp 是否保存第一维数组的值或该数组中的索引?
  • 您必须搜索 comp 然后获取第二个值。目前您将它用作索引,因此应该是一个 int。您可以使用 for 循环,直到找到 comp 然后从那里访问第二个元素

标签: javascript jquery arrays json multidimensional-array


【解决方案1】:

没有。除非第一个数组的“值”(也许我应该说,第一个维度,或者第一行),它也是 key。也就是说,除非是这样的:

log = {
    'comp': 'Please add a company name'
                   .
                   .
                   .
}

现在,log['comp']log.comp 是合法的。

【讨论】:

  • 嗯。所以我的 [value1, value2] 不是很有帮助 :-( 感谢您的信息
  • 不是你想要的方式。无论如何,循环总是可用的,对吧?但是,您可能会担心性能,不是吗?
  • @frequent 在 Javascript 中,您应该使用对象按值查找元素,否则,您应该跟踪索引(或“键”)以快速导航数组。
  • 你总是可以打破循环,这样你就不必经历整个事情。
【解决方案2】:

有两种方法可以做到这一点,但都没有避免循环。第一种是每次访问项目时循环遍历数组:

var val = '';
for (var i = 0; i < errorLog.length; i++) {
    if (errorLog[i][0] === "comp") {
        val = errorLog[i][1];
        break;
    }
}

另一种方法是将数组转换为对象并使用对象表示法访问它。

var errors = {};
for (var i = 0; i < errorLog.length; i++) {
    errors[errorLog[i][0]] = errorLog[i][1];
}

然后您可以使用errors.comp 访问相关值。

如果您只看一次,第一个选项可能更好。如果您可能不止一次查看,最好使用第二个系统,因为 (a) 您只需要执行一次循环,这样效率更高,(b) 您不会重复循环代码,(c ) 你想做什么就很明显了。

【讨论】:

    【解决方案3】:

    无论你要以某种方式循环遍历数组,即使它被 jQuery 之类的工具对你来说有点模糊。

    您可以像这样从数组中创建一个对象:

    var objLookup = function(arr, search) {
        var o = {}, i, l, first, second;
    
        for (i=0, l=arr.length; i<l; i++) {
            first = arr[i][0]; // These variables are for convenience and readability.
            second = arr[i][1]; // The function could be rewritten without them.
    
            o[first] = second;
        }
    
        return o[search];
    }
    

    但更快的解决方案是循环遍历数组并在找到值后立即返回:

    var indexLookup = function(arr, search){
       var index = -1, i, l;
    
        for (i = 0, l = arr.length; i<l; i++) {
            if (arr[i][0] === search) return arr[i][1];
        }
    
        return undefined;
    }
    

    然后您可以在代码中像这样使用这些函数,这样您就不必在所有代码的中间进行循环:

    var log = [
        ["comp","Please add company name!"],
        ["zip","Please add zip code!"]
    ];
    
    objLookup(log, "zip"); // Please add zip code!
    indexLookup(log, "comp"); // Please add company name!
    

    这是一个jsfiddle,显示这些正在使用中。

    【讨论】:

    • 也谢谢,我接受了 lonesomeday 的提议。也为你 +1!
    【解决方案4】:

    你看过 jQuery 的 grepinArray 方法吗?

    查看此讨论

    Are there any jquery features to query multi-dimensional arrays in a similar fashion to the DOM?

    【讨论】:

    • 这是一个问题和一个链接,而不是一个答案:)
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多