按值排列数组中的对象并更新整个对象

时间:2015-07-22 10:29:25

标签: javascript jquery arrays

我有一个对象列表,有时候我会从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;

不幸的是,该项目未更新......

4 个答案:

答案 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