Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 迭代Algolia命中将用最后一个结果的ID覆盖每个ID_Javascript_Algolia - Fatal编程技术网

Javascript 迭代Algolia命中将用最后一个结果的ID覆盖每个ID

Javascript 迭代Algolia命中将用最后一个结果的ID覆盖每个ID,javascript,algolia,Javascript,Algolia,我有一个包含如下数据的Algolia索引: id:FirstLastNumber name:First Name objectID:FirstLastNumber address:1234 Fake Street city:New York state:NY algoliaIndex.search({ query: input }, function searchDone(error, content) { if (error) {

我有一个包含如下数据的Algolia索引:

id:FirstLastNumber
name:First Name
objectID:FirstLastNumber
address:1234 Fake Street
city:New York
state:NY
algoliaIndex.search({
        query: input
    }, function searchDone(error, content) {
        if (error) {
            console.log(error);
            return;
        }
        var results = document.getElementById('results');
        for (var hit in content.hits) {
            var resultName = content.hits[hit].name;
            var resultCity = content.hits[hit].city;
            var resultID = content.hits[hit].id
            var resultItem = document.createElement('a');
            resultItem.className = "collection-item";
            resultItem.innerHTML = "<div class='list-text'><span 
                class='title-in-list'>" + resultName + "</span><br><span 
                class='date-in-list'>" + resultCity + "</span></div>";
            resultItem.onclick = function() {
                //pull details for the member.
                getMember(resultID);
            };
            results.appendChild(resultItem);
        };
    });
我查询并将结果转储到如下页面:

id:FirstLastNumber
name:First Name
objectID:FirstLastNumber
address:1234 Fake Street
city:New York
state:NY
algoliaIndex.search({
        query: input
    }, function searchDone(error, content) {
        if (error) {
            console.log(error);
            return;
        }
        var results = document.getElementById('results');
        for (var hit in content.hits) {
            var resultName = content.hits[hit].name;
            var resultCity = content.hits[hit].city;
            var resultID = content.hits[hit].id
            var resultItem = document.createElement('a');
            resultItem.className = "collection-item";
            resultItem.innerHTML = "<div class='list-text'><span 
                class='title-in-list'>" + resultName + "</span><br><span 
                class='date-in-list'>" + resultCity + "</span></div>";
            resultItem.onclick = function() {
                //pull details for the member.
                getMember(resultID);
            };
            results.appendChild(resultItem);
        };
    });

如何获取从Algolia返回的id或objectID以粘贴到相应的项?

问题在于javascript作用域的工作方式。即使看起来您在每个键迭代中都创建了一个具有不同的
resultId
的函数,但实际上并非如此。由于
resultId
是由外部
hit
变量确定的,并且在每个循环中
hit
都会被覆盖,因此您最终会对同一
hit
变量有多个引用,因此您总是会看到循环中设置为
hit
的最后一个ID的返回值

一种解决方案是将onClick函数声明包装在函数中,以便在每次迭代时在distinct
hit
值上创建闭包。也许这会奏效:

    setHandler = function(id) {
            return function() {getMember(id)};
        };

    resultItem.onClick = setHandler(resultID)

问题在于javascript作用域的工作方式。即使看起来您在每个键迭代中都创建了一个具有不同的
resultId
的函数,但实际上并非如此。由于
resultId
是由外部
hit
变量确定的,并且在每个循环中
hit
都会被覆盖,因此您最终会对同一
hit
变量有多个引用,因此您总是会看到循环中设置为
hit
的最后一个ID的返回值

一种解决方案是将onClick函数声明包装在函数中,以便在每次迭代时在distinct
hit
值上创建闭包。也许这会奏效:

    setHandler = function(id) {
            return function() {getMember(id)};
        };

    resultItem.onClick = setHandler(resultID)

这是一个范围问题。在循环中,hit变量的作用域是全局的。您可以将for循环中的代码封装在一个闭包中,该闭包捕获循环中该点处的
hit
值,或者如果您同意使用ES6功能,可以使用
let
代替var

选择1 :

选择2
这是一个范围问题。在循环中,hit变量的作用域是全局的。您可以将for循环中的代码封装在一个闭包中,该闭包捕获循环中该点处的
hit
值,或者如果您同意使用ES6功能,可以使用
let
代替var

选择1 :

选择2
谢谢你们两位!我现在明白多了。谢谢你们!我现在明白多了。