如何在javascript中替换数组中的特定对象?

如何在javascript中替换数组中的特定对象?,javascript,underscore.js,Javascript,Underscore.js,我有一个用户数组,我想更新其中一个用户 users = [ {userId: 23, userName:"foo"}, {userId: 34, userName:"wrong"}, {userId: 45, userName:"baz"} {userId: 56, userName:"..."}, ] updatedUser = { userId: 34, userName: bar } 我用的是下划线。我认为最简单的方法是找到要更新的用户的索引,然后将该用户的值设

我有一个用户数组,我想更新其中一个用户

users = [
  {userId: 23, userName:"foo"},
  {userId: 34, userName:"wrong"},
  {userId: 45, userName:"baz"}
  {userId: 56, userName:"..."},
]

updatedUser = {
  userId: 34,
  userName: bar
}
我用的是下划线。我认为最简单的方法是找到要更新的用户的索引,然后将该用户的值设置为我的更新值。不幸的是,下划线函数不接受属性,只接受值。要使用它,我必须首先使用户,然后将返回的内容传递到indexOf:

var valueOfUpdatedUser = _.findWhere(users, { userId: updatedUser.userId })
var indexOfUpdatedUser = _.indexOf(users, valueOfUpdatedUser)
users[indexOfUpdatedUser] = updatedUser;
第二种方法是删除匹配的用户,然后将更新后的用户推送到阵列中

当然有更好、更简单的方法吗?

您可以在
findWhere
之后使用。从技术上讲,这与完全用另一个实例替换对象不同,但它消除了阵列上的额外循环:

_.extend(_.findWhere(users, { userId: updatedUser.userId }), updatedUser);
如果这仍然不令人满意,那么您最好的选择可能是手动迭代


我有意将“由用户id设置密钥的对象属性”方法排除在讨论之外,因为在实践中,一开始就有一个数组并不少见(例如,用户数组是由API检索的)。

使用id作为属性名的对象比使用数组更容易:

var users = {
  23: {userName: "foo"},
  34: {userName: "wrong"},
  45: {userName: "baz"},
  56: {userName: "..."}
};
然后,要更新某个用户的数据,只需使用

users[updatedUserId] = updatedUserData;
不幸的是,下划线的indexOf函数不接受属性,只接受值

在这种情况下,可以使用

从文档中:

与u.indexOf类似,返回谓词真值测试通过的第一个索引;否则返回-1

所以在这种情况下,你可以这样做:

var indexOfUpdatedUser = _.findIndex(users, { userId: updatedUser.userId });
users[indexOfUpdatedUser] = updatedUser;

更新:检查-1值可能是个好主意(即,如果找不到索引)

您可以自己迭代数组,您可以循环数组,直到找到用户为止。或者,使用一个对象代替userId作为键。由于Id根据定义是唯一的,因此您可以创建
用户
作为对象,并使用
用户Id
作为键<代码>用户={23:{userName:'foo'},34:{userName:'error'}。这使得更新非常容易:
users[34]。用户名='bar'。由于userId是唯一的,我建议您使用散列而不是数组
23:{userinfo here},34:{other userinfo here}
。在这种情况下,替换代码将只是用户[%id%]={new info here};在我的例子中,我使用“findIndex”而不是“findWhere”。也许这是使用中的下划线版本的问题,但它似乎以同样的方式工作,因此感谢您提供的信息和代码!!快乐编码!
var indexOfUpdatedUser = _.findIndex(users, { userId: updatedUser.userId });
users[indexOfUpdatedUser] = updatedUser;