我有一个对象列表,有时候我会从API中获取其中一个对象的更新,我需要做的是找到一个具有更新和更新整个对象的id的对象...
我试图避免使用for循环,因为列表可能非常长。
所以我试图使用的是$ .grep,但它似乎没有按预期工作。
这是我到目前为止所尝试的内容:
// item is the response data from the API
var item = res.item;
var index = $.grep(arrayOfItems, function (e, i) {
if (e.id === item.id) {
return i;
}
});
arrayOfItems[index] = item;
不幸的是,该项目未更新......
答案 0 :(得分:2)
如果你的速度很快,特别是在列表很长的情况下,你可以考虑在第一次检索它时按id索引你的列表,以后更快地进行更新,而不是循环整个数组来查找索引。
为了演示,假设您已经检索了一个对象数组
<select id="ss">
<option value="1">1</option>
<option value="2">2</option>
</select>
$('#ss').keypress(function(e){
var p = e.keyCode;
alert(p);
if(p==13){
alert('enter was pressed');
}
});
现在创建一个对象来表示你的数据,其中属性是Id(对象属性不能以数字开头,所以如果var data = [
{id:1,data:'hello'},
{id:2,data:'world'},
{id:3,data:'foo'},
{id:4,data:'bar'}];
是数字,前缀为),则值是返回原始数组的索引。因此,上述数据将转换为
id
这可以通过函数
轻松完成var dataIndex = {
id1:0,
id2:1,
id3:2,
id4:3
};
现在,在您的更新中,您可以使用id
立即找到索引function indexDataById(data)
{
var index = {};
$.each(data, function(e,i){
index['id' + e.id] = i;
});
return index;
}
var dataIndex = indexDataById(data);
一个复杂因素是,如果新数据的var updateId = 2;
var elementIdx = dataIndex ['id' + updateId];
data[elementIdx] = myNewData;
发生了变化,您需要返回并更新索引:
id
这应该很容易随你的更新自动处理。
答案 1 :(得分:0)
尝试使用map
这样的方法。
代码段:
// item is the response data from the API
var item = res.item;
var index = $.map(arrayOfItems, function (e, i) {
if (e.id === item.id) {
return i;
}
});
if(index.length)
arrayOfItems[index[0]] = item;
<强>更新强>
arrayOfItems[index] = item;
如果index
数组只有一个元素,这将有效。见fiddle
但是,
arrayOfItems[index[0]] = item;
这是适当的方式,因为它是一个数组。
答案 2 :(得分:0)
$ .map和$ .grep返回一个数组,因此你永远不会得到索引。
在$ .map或$ .grep函数中,您需要返回true或false 在您的过滤器逻辑上。它们对你的情况没用。
如果你的结构没有订购,你只能循环通过它并在找到你的元素时停止循环......就像那样:
var item = res.item;
var index = "";
$.each(arrayOfItems, function(i,v){
if(item.id == v.id){
index = i;
return true;
}
});
arrayOfItems[index] = item;
如果你想在循环之前订购你的结构,请使用:
arrayOfItems.sort(function(a, b) {
return a.id > b.id;
});
我做了一个小例子https://jsfiddle.net/L08rk0u3/
答案 3 :(得分:0)
使用 $。grep
尝试这种方式gitlab-ci.yml