2

我正在尝试根据其 ID 编辑数组中的数据。这是我的数组:

var myCollection = {
"data": [
{ "id":"1", "Name":"John Smiths", "AMT_STD":"1.99"},
{ "id":"2", "Name":"Carlsberg", "AMT_STD":"1.99"},
{ "id":"3", "Name":"Samuel Adams", "AMT_STD":"1.99"}
  ]};

我想做的是创建一个函数,允许我在数组中找到 id=1,然后将 AMT_STD 的值更新为 1.00。

通过查看其他问题,我设法添加到数组并删除项目,但我还没有弄清楚如何查找然后编辑和项目。

我使用下面的代码添加项目:

function Add_Item() {
myCollection.data.push( { "id":"4", "Name":"Fosters", "AMT_STD":"1.99" } );
}

我使用下面的代码删除项目:

function findAndRemove(array, property, value) {
$.each(array, function(index, result) {
if(result[property] == value) {
array.splice(index, 1);
}    
});

由 findAndRemove(myCollection.data, 'id', '1') 调用;

我试图编辑 findAndRemove 函数,因为该方法可以在数组中找到项目,但是我无法弄清楚在索引中编辑项目的语法,并希望有人能指出我正确的方向。

4

3 回答 3

3

你可以走那条路,并且有这样做的功能..

但如果您仍然可以更改格式,请考虑

var myCollection = {
  data: {
    1:{Name:"John Smiths", "AMT_STD":"1.99"},
    2:{Name:"Carlsberg", "AMT_STD":"1.99"},
    3:{Name:"Samuel Adams", "AMT_STD":"1.99"}
  }
}

插入或记录更新可以这样完成:

myCollection.data[4]={Name:"Fosters", "AMT_STD":"1.99" }

更新一个值:

myCollection.data[2]["AMT_STD"]="2.00"

检索数据

myCollection.data[1];//the full record
myCollection.data[1].Name;//just the name
myCollection.data[1]["AMT_STD"];//similar to the previous but can use more complex keys/names

删除记录

delete myCollection.data[2];

这样就不需要插入、搜索或删除代码(使用 javascript 对象内置功能)。您可以使用字符串作为 id(不限于数字),并且您可以利用 javascript 的快速索引搜索

希望能帮助到你。

于 2012-04-21T16:42:56.480 回答
1

其他答案中有很好的指导方针。但是,如果你真的想像 findAndRemove 函数那样做,最类似的方法是创建一个函数 findAndReplace 如下,它将在找到匹配项时更新属性作为附加参数(在你的情况下为“AMT_STD”)以及它应该更新为(在您的情况下为 1.00)的值:

   function findAndReplace(array, property, value, replaceProperty, replaceValue) {
    $.each(array, function(index, result) {
        if (result[property] == value) {
            result[replaceProperty] = replaceValue;
        }
    });
   } 

如下调用它:

findAndReplace(myCollection.data, 'id', '1', 'AMT_STD', 1.00);

作为附加说明,您在问题中使用的 findAndRemove 函数实际上会在某些浏览器中导致 javascript 错误。您不能在“.each”函数的中间调用 splice 方法,因为 jQuery 将尝试在数组中已删除的对象之一上运行该函数,该对象随后具有未定义的值。更好的方法是将要删除的项目的索引保存在变量中,然后在执行 .each 之后运行 splice 函数。

于 2012-04-21T17:00:26.673 回答
0

这个原型方法怎么样?

Array.prototype.updateById = function(id, key, val) {
  // Loop the array - this refers to the array in this context
  for (var i = 0; i < this.length; i++) {
    if (this[i].id == id) {
      this[i][key] = val;
      return true;
    }
  }
  return false;
};

// Use it like this:
var updateSuccess = myCollection.data.updateById(1, "AMT_STD", "1.00");

// updateSuccess is now a boolean indicating whether the object was found and updated

通过对其进行原型设计,您可以将该方法用于任何包含具有id属性的对象的数组对象。

于 2012-04-21T16:21:12.833 回答