将项推送到Ajax方法中的新数组中
Push item into new array within Ajax method
我有以下数组
var arrayOfResults = []; // Results after like statement
我调用数据库,它会返回一个json结果,如下所示:
[{
"id": "{fcb42c9c-3617-4048-b2a0-2600775a4c34}",
"pid": "{34214CCB-90C3-4D75-958B-5A1D0FBDD971}",
"ttl": "Easter Bunny",
"img": "/~/media/Images/Recipes/Easter/Filled Pasta/LF_Baked-Spring-Vegetables-Ravioli_920.ashx?h=910'u0026w=910",
"url": "Some url",
"taggedwith": ["{3A54907D-4171-4F4E-8FE8-3A38DA1E874F}", "{6CD78C6B-F435-45EC-BE16-810E80311C23}", "{74528A6F-C40B-4030-A278-A4C9A2F46A47}", "{6DC82B78-61F6-45A0-A63C-EA590BB1057E}", "{E9EF1A41-51D0-403D-9373-37B7A880B251}"],
"articleddate": "2015-05-02",
"tname": "Recipe",
"rbrand": ["{1F6EDA5D-4681-40F0-B455-7C343AC25B72}"]
}, {
"id": "{2e4b04b6-334f-42e9-afd7-ddc4e08417ad}",
"pid": "{C611BAC8-E8E0-4693-920B-93BD5EE2386B}",
"ttl": "Latina Fettuccini 'u0026 Summer Sauce with Prawns Recipe",
"img": "/~/media/Images/Recipes/Latina Fresh/Plain Pasta/LF_Fettuccini-Summer-Sauce-Prawns_920.ashx?h=910'u0026w=910",
"url": "Some url",
"taggedwith": ["{3A54907D-4171-4F4E-8FE8-3A38DA1E874F}", "{6CD78C6B-F435-45EC-BE16-810E80311C23}", "{74528A6F-C40B-4030-A278-A4C9A2F46A47}", "{6DC82B78-61F6-45A0-A63C-EA590BB1057E}", "{E9EF1A41-51D0-403D-9373-37B7A880B251}"],
"articleddate": "2015-05-02",
"tname": "Recipe",
"rbrand": ["{1F6EDA5D-4681-40F0-B455-7C343AC25B72}"]
}]
在UI上,我有一个文本字段,用户可以在其中输入自由文本。
当用户输入大约5个字符时,我调用以下ajax方法,我试图实现的是,我想对上面数组中的ttl字段执行类似的语句,如果ttl字段匹配或类似于用户输入的freeText,那么我想将该项推送到数组"arrayOfResuts"中,但我看到了发现的警告消息,但它没有将该项推入新数组中,我知道这一点,因为我提醒ajax调用结束时的长度及其0;
var addItem = false;
var freeText = $('#searchKeywords').val();
$.ajax({
url: 'search?t=&s=DateDesc&type=globalsearch&q=',
type: 'GET',
dataType: 'json',
success: function (searchDataList) {
console.log(searchDataList)
for (var i = 0; i < searchDataList.length; i++) {
addItem = false;
if (freeText.length > 0) { // Filter on free text
if (searchDataList[i].ttl.indexOf(freeText) > -1) { // if title contains free text then we need to add it to the arrayOfResults[].
alert('found');
arrayOfResults.push(searchDataList[i]) // This doesn't seem to work.
addItem = true;
}
}
} // End of for loop
},
error: function (request, error) {
}
});
alert(arrayOfResults.length);
现在我还不能100%确定到底出了什么问题,所以如果能提供任何帮助,我将不胜感激。
在AJAX请求完成之前,您的警报正在运行。
由于AJAX请求是异步的,console.log()
代码在调用成功之前运行,因此您不会打印所需的结果。
要打印结果,只需在AJAX请求的成功和错误函数中打印即可。在完整的函数中这样做没有帮助,因为它与其他函数异步运行。
正如前面提到的其他答案一样,您需要处理成功块中的数据。您可以像下面这样直接执行,或者对于更复杂的情况,调用一个新函数来处理成功语句末尾的数据。
更新代码:
var freeText = $('#searchKeywords').val();
$.ajax({
url: 'search?t=&s=DateDesc&type=globalsearch&q=',
type: 'GET',
dataType: 'json',
success: function (searchDataList) {
console.log(searchDataList);
for (var i = 0; i < searchDataList.length; i++) {
addItem = false;
if (freeText.length > 0) {
if (searchDataList[i].ttl.indexOf(freeText) > -1) {
alert('found');
arrayOfResults.push(searchDataList[i]);
addItem = true;
}
}
} // End of for loop
if (arrayOfResults.length > 1) {
alert(arrayOfResults.length);
console.log(arrayOfResults);
}
},
error: function (request, error) {
}
});
您的警报将始终为0,因为AJAX是异步的(AJAX中的A代表异步),并且您同步调用警报。
实际情况是,ajax请求获取数据,而synchron代码照常运行。既然ajax请求已经清楚地完成了,那么在调用警报之后,它将无法记录任何有意义的内容。
如果您希望在异步请求完成时调用某个函数,无论它是否成功,请在success:
和error:
之外使用done
。此代码将在请求完成后运行,并向您显示实际长度。
相关文章:
- javascript处理一个对象数组以获得一个新的对象数组
- 创建新的javascript数组,从对象属性中提取数据
- 在现有的json对象中添加一个新的键(数组)
- 比较两个JSON数组并重新排列新的JSON数组格式
- 使用 JavaScript 比较 2 个数组并创建一个新的对象数组,该数组不包含与 id 字段匹配的对象
- 将字段添加到新的 JavaScript 数组副本
- 在运行之前确定数据是否是新的(将数组与 JSON 进行比较)
- 如何将两个 JS 数组连接到一个新的对象数组作为键:值
- 如何将现有 JSON 对象数组的某些对象复制到新的 JSON 数组
- Javascript:用一个新值替换数组中的所有内容
- 将对象的值推送到新的对象数组中
- 通过比较和推送唯一对象来创建新的对象数组
- 计算JavaScript数组元素的出现次数,并放入一个新的2d数组
- 在angular(循环中的循环)中创建新的对象数组时遇到麻烦
- 如何循环遍历新生成的数组而不覆盖它?
- 我如何组合数组中的数据值来创建一个新的数组
- 如何在Mongoose中添加一个新对象到数组
- 什么时候改变子数组更新子数组vs.创建一个新的子数组?[JavaScript]
- 通过组合另一个数组的两列来形成一个新的javascript数组
- 为什么我不能将new Array(3)映射到一个包含新值的数组?