使对象Object作为数组的索引(Javascript)

时间:2017-03-13 09:40:05

标签: javascript jquery typescript

我一直在使用此回购中的填字游戏应用:https://github.com/jweisbeck/Crossword。问题是该程序使用jquery版本1.6.2,我的整个项目使用jquery-3.1.1版本。特别是,错误出现在这里:

buildEntries: function() {
    var puzzCells = $('#puzzle td'),
        light,
        $groupedLights,
        hasOffset = false,
        positionOffset = entryCount - puzz.data[puzz.data.length-1].position; // diff. between total ENTRIES and highest POSITIONS

    for (var x=1, p = entryCount; x <= p; ++x) {
        var letters = puzz.data[x-1].answer.split('');

        for (var i=0; i < entries[x-1].length; ++i) {

            light = $(puzzCells +'[data-coords="' + entries[x-1][i] + '"]');

            if($(light).empty()){
                console.log($(light));
                $(light)
                    .addClass('entry-' + (x-1) + ' position-' + (x-1) )
                    .append('<input maxlength="1" val="" type="text" tabindex="-1" />');
            }
        }
    }

    // Put entry number in first 'light' of each entry, skipping it if already present
    console.log(entries);
    console.log(puzz.data);
    for (var i = 0; i < entryCount; i++) {
        $groupedLights = $('.entry-' + i); 
        if(!$('.entry-' + i +':eq(0) span').length){
            $groupedLights.eq(0)
                .append('<span>' + puzz.data[i].position + '</span>');
        }
    }

    util.highlightEntry();
    util.highlightClue();
    $('.active').eq(0).focus();
    $('.active').eq(0).select();            
}

错误与

一致
light = $(puzzCells +'[data-coords="' + entries[x-1][i] + '"]');

浏览器显示此错误:

  

错误:语法错误,无法识别的表达式[object Object] [data-coords =&#34; 1,6&#34;]

我相信这与jQuery版本有关。或者程序可能使用[object Object]作为索引。不确定,因为我是jQuery的新手。我尝试使用jQuery Migrate,但它没有帮助。此外,我尝试使用jQuery 1.6.2,但是因为我使用的是Typescript并且必须通过.d.ts文件安装jQuery,所以Web浏览器根本找不到jQuery。任何提示或建议?提前致谢

3 个答案:

答案 0 :(得分:1)

正如标题所说:

  

将对象Object作为数组的索引

使用标准对象/阵列是不可能的,但您可以使用Map:

let map = new Map(),
    key = {id: '##'};

map.set(key, [1,2,3,4,5]);

console.log(map.get(key)); //[1,2,3,4,5]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

答案 1 :(得分:0)

错误中显示的字符串中的[object Object]是因为jQuery对象被附加到字符串以创建选择器,该选择器无效。

在您的代码中,正是这一行导致了问题:

var puzzCells = $('#puzzle td') // holds jQuery object

// later on...
light = $(puzzCells + '[data-coords="' + entries[x-1][i] + '"]');

这与使用的jQuery版本无关,因为它是一个语法问题。

要解决此问题,您应该在filter()对象上使用puzzCells,而不是将其附加到选择器。试试这个:

light = puzzCells.filter('[data-coords="' + entries[x-1][i] + '"]');

答案 2 :(得分:0)

您正在连接对象(puzzCells)和字符串。当JavaScript检测到字符串连接时,尝试在连接它们之前将所有变量转换为字符串。在纯JavaScript中,如果您执行WHATEVEROBJECT.toString(),则会收到[object Object],这就是您看到包含该消息的错误的原因。

这不是jQuery版本问题,因为这发生在非常低​​级别(JavaScript)。

puzzCells是一个jQuery对象,您可以在其中调用jQuery方法。在这种情况下,您需要过滤方法,如下所示:

light = puzzCells.filter('[data-coords="' + entries[x-1][i] + '"]');

点击此处查看更多信息:http://api.jquery.com/filter/