根据给定的键更新AngularJS数组项

4
我将使用 AngularJS 创建一个站点。
这是我的数组:
```html

...

```
$scope.replyList = [
  {
    "id": "85485",
    "reply_content": "aaaaaaa",
    "reply_gender": "1",
    "reply_author": "John"
  },
  {
    "id": "85487",
    "reply_content": "bbbbbbb",
    "reply_gender": "1",
    "reply_author": "Ben"
  },
  {
    "id": "85504",
    "reply_content": "ccccccc",
    "reply_gender": "1",
    "reply_author": "Wang"
  }
]

我想要做的是通过给定的键id更新项目值。

例如,我想要更新id为85485的内容。你该怎么处理?

$scope.replyList[{id: 85475}].reply_content = 'dddddd'; /* failed */

非常感谢你。
3个回答

6
使用Array#find方法来获取数组元素。
$scope.replyList.find(function(v) {
  return v.id == 85475;
}).reply_content = 'dddddd';

// or with ES6 arrow function 

$scope.replyList.find(v => v.id == 85475).reply_content = 'dddddd';


var replyList = [{
  "id": "85475",
  "reply_content": "aaaaaaa",
  "reply_gender": "1",
  "reply_author": "John"
}, {
  "id": "85487",
  "reply_content": "bbbbbbb",
  "reply_gender": "1",
  "reply_author": "Ben"
}, {
  "id": "85504",
  "reply_content": "ccccccc",
  "reply_gender": "1",
  "reply_author": "Wang"
}];

replyList.find(function(v) {
  return v.id == 85475;
}).reply_content = 'dddddd';

console.log(replyList);


对于旧版浏览器,请检查find方法的polyfill选项


更新:如果您想更新具有特定id的所有元素,请使用Array#forEach方法进行迭代。实际上,由于您只想更新值,因此不需要Array#find方法。

$scope.replyList.forEach(function(v) {
   if(v.id == 85475) v.reply_content = 'dddddd';
});

var replyList = [{
  "id": "85475",
  "reply_content": "aaaaaaa",
  "reply_gender": "1",
  "reply_author": "John"
}, {
  "id": "85487",
  "reply_content": "bbbbbbb",
  "reply_gender": "1",
  "reply_author": "Ben"
}, {
  "id": "85504",
  "reply_content": "ccccccc",
  "reply_gender": "1",
  "reply_author": "Wang"
}];

replyList.forEach(function(v) {
  if (v.id == 85475) v.reply_content = 'dddddd';
});

console.log(replyList);


非常感谢!这段代码显示了一个错误:“未定义的对象”。你的问题是什么? - Benyi
@Benyi:没有该ID的元素。 - Pranav C Balan
@Benyi:为了避免这种情况,可以像下面这样保留一个引用变量: var obj = $scope.replyList.find(function(v) { return v.id == 85475; }); obj && obj.reply_content = 'dddddd'; - Pranav C Balan
非常感谢。我犯了一个愚蠢的错误。这个可以正常工作。很有帮助! - Benyi
@Benyi:很高兴能帮忙。 - Pranav C Balan

2
使用数组的.filter方法并获取结果的第一个位置。
$scope.replyList.filter(function(item){
  return item.id === '85475';
})[0].reply_content = 'dddddd';

如果存在多个具有给定键值的结果,则使用.map方法处理它们。
$scope.replyList
  .filter(function(item){
    return item.id === '85475';
  })
  .map(function(item){
     item.reply_content = 'ddddd'
     return item;
   });

利用JavaScript的函数式编程方法吧!

非常感谢。这段代码在AngularJS中可以正常工作! - Benyi

0
使用简单的for循环遍历数组,找到具有匹配id的对象并替换内容。这在所有浏览器中都可以工作。
function replace(array, id, content) {
    var len = array.length,
        i;

    for (i = 0; i < len; i++) {
        if (array[i].id === id) {
            array[i].reply_content = content;
        }
    }
};

replace($scope.replyList, '85485', 'replacedcontent');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接