如果用户存在于 users 数组中,请编写一个 editUser 函数?

Write a function which editUser if the user exist in the users array?

我正在使用带有三元运算符的 array.map 高阶函数来检查条件。我对方法不熟悉Object.assign

我尝试了问题的解决方案,但在控制台没有给出return,请验证并纠正我的方法。

   const users = [
        {
            name:'Brook', 
            scores:75,
            skills:['HTM', 'CSS', 'JS'],
            age:16
        },
        {
            name:'Alex', 
            scores:80,
            skills:['HTM', 'CSS', 'JS'],
            age:18
        }, 
        {
            name:'David', 
            scores:75,
            skills:['HTM', 'CSS'],
            age:22
        }, 
        {
            name:'John', 
            scores:85,
            skills:['HTM'],
            age:25
        },
        {
            name:'Sara',
            scores:95,
            skills:['HTM', 'CSS', 'JS'],
            age: 26
        },
        {
            name:'Martha', 
            scores:80,
            skills:['HTM', 'CSS', 'JS'],
            age:18
        },
        {
            name:'Thomas',
            scores:90,
            skills:['HTM', 'CSS', 'JS'],
            age:20
        }
        ]

我的解决方案:(NodeJS)

const editUser = (users, userUpdate) => {
    return users.map((user) => user.name == userUpdate ? Object.assign(user, { scores: userUpdate.scores, skills: userUpdate.skills, age: userUpdate.age }) : user);
}

执行:

const userUpdate = {
    name: 'Alex',
    scores: 88,
    skills: ['HTM', 'CSS', 'JS', 'FullStack'],
    age: 20
}
console.log(editUser(users, userUpdate));

userUpdate 是包含名称 属性 的对象,必须 user.name 与 userUpdate.name

在这个问题中,你将对象与名称进行比较,但不相等。

const editUser = (users, userUpdate) => {
    return users.map((user) => user.name == userUpdate.name ? Object.assign(user, { scores: userUpdate.scores, skills: userUpdate.skills, age: userUpdate.age }) : user);
};

您可以使用 Array.prototype.findIndex()userUpdate.name

数组中获取用户的 index
  • 优点是在用户多的情况下,找到用户后搜索会立即停止

因此,如果 index 大于 0

,您可以修改该用户

代码:

const users = [{name: 'Brook',scores: 75,skills: ['HTM', 'CSS', 'JS'],age: 16,},{name: 'Alex',scores: 80,skills: ['HTM', 'CSS', 'JS'],age: 18,},{name: 'David',scores: 75,skills: ['HTM', 'CSS'],age: 22,},{name: 'John',scores: 85,skills: ['HTM'],age: 25,},{name: 'Sara',scores: 95,skills: ['HTM', 'CSS', 'JS'],age: 26,},{name: 'Martha',scores: 80,skills: ['HTM', 'CSS', 'JS'],age: 18,},{name: 'Thomas',scores: 90,skills: ['HTM', 'CSS', 'JS'],age: 20,}]

const userUpdate = {
  name: 'Alex',
  scores: 88,
  skills: ['HTM', 'CSS', 'JS', 'FullStack'],
  age: 20,
}

const editUser = (users, userUpdate) => {
  const index = users.findIndex((u) => u.name === userUpdate.name)
  if (index > 0) {
    users[index] = userUpdate
  }
  return users
}
  

const result = editUser(users, userUpdate)

console.log(result)

我们有时使用 object.asign() 在 JavaScript 中克隆一个对象(没有引用)

let user = { name: 'Alex'}
let newUser = user;
newUser.name = 'John';

console.log(newUser); //{ name: 'John' }
console.log(user); // { name: 'John' }

如果您想克隆一个没有引用的对象,您可以使用 Object.assign()three dots (...) 在 Javascript

中调用 spread operator

我更喜欢three dots,因为它是ECS6的特性。

使用Object.assign()

let user = { name: 'Alex'}
let newUser = Object.assign({}, user);
newUser.name = 'John';

console.log(newUser);// { name: 'John' }
console.log(user);//{ name: 'Alex' }

使用three dots (...)spread operator

let user = { name: 'Alex'}
let newUser = {...user};
newUser.name = 'John';

console.log(newUser); // { name: 'John' }
console.log(user); //{ name: 'Alex' }

您可以访问此 tutorial 以获取更多示例

要使用 Object.assign() 或 'sperate operator' 合并对象,请检查此 tutorial

回答你的问题是:

我认为你不需要 Object.assign() 因为 usersuserUpdated 的键是相似的所以就这样试试:

const editUser = (users, userUpdate) => {
      return users.map((user) => user.name == userUpdate.name ? userUpdate: user);
};