如何更新数组中对象的所有值?

How do i update all values of an object in an array?

当每个薪水都是一个对象的 属性 并且每个对象都存储在一个数组中时,如何更改所有薪水值并按百分比增加它们?例如。增加 10%,我必须将结果四舍五入到最接近的整数:

raiseSalary([
    { name: "Ali", salary: 3000 },
    { name: "Rob", salary: 2000 },
    { name: "Adam", salary: 4500 },
], 10)

上面的调用应该return:

[
   { name: 'Ali', salary: 3300 },
   { name: 'Rob', salary: 2200 }, 
   { name: 'Adam', salary: 4950 }
]

这是我写的代码:

function raiseSalary(arr, raise) {
    if (arr.length === 0) {
        return [{}];
    } else {
        const raiseArray = arr.map((salaryObj) => {
            return (salaryObj.salaryObj / 100) * 10;
        });
    }
}

地图方法应该做你想做的。注意 salaryObj 的解构以避免操纵原始对象。

const percent = 10;
const multiplier = 1 + (percent / 100);
const salaries = [
  { name: "Ali", salary: 3000 },
  { name: "Rob", salary: 2000 },
  { name: "Adam", salary: 4500 },
];
const newSalaries = salaries.map((salaryObj) => {
  return {
    ...salaryObj,
    salary: salaryObj.salary * multiplier,
  };
});

console.log(newSalaries);
let userDetail=[
        { name: "Ali", salary: 3000 },
        { name: "Rob", salary: 2000 },
        { name: "Adam", salary: 4500 },
    ];
function getPercentage(num, percentage){
   return num * (percentage / 100);
}
userDetail=userDetail.map(x=> {
    return{
        ...x,
        salary:x.salary+getPercentage(x.salary,10)
    }
        })
console.log(userDetail)

下面介绍的是实现所需 objective 的一种可能方法。

代码段

const addRaise = (arr, pcnt) => (
  arr.map(
    ({ salary, ...rest }) => ({
      ...rest,
      salary: ( +salary * (+pcnt + 100) / 100 )
    })
  )
);

/*
// method to raise salary by "pcnt" percent
const addRaise = (arr, pcnt) => (
  // iterate over array "arr"
  arr.map(
    // destructure to access "salary"
    ({ salary, ...rest }) => ({
      ...rest,        // all other props retained as-is
      // salary updated to be 10% more than current
      salary: ( +salary * (+pcnt + 100) / 100 )
    })
  )
);
*/

const dataArr = [{
    name: "Ali",
    salary: 3000
  },
  {
    name: "Rob",
    salary: 2000
  },
  {
    name: "Adam",
    salary: 4500
  },
];

console.log(
  'adding raise of 10%...\n',
  'new array:\n',
  addRaise(dataArr, 10)
);

说明

添加到上面代码段的评论。

你快到了。就几点

  • 就像当数组有零个元素时你return一些东西,当它有元素时你必须return一些东西;在这种情况下,修改后的数组
  • 通过使用它们的键并提供数据来保留对象,否则,您最终会得到一个只有数字的数组。
  • 由于您的目标是将薪水提高 raise,因此不乘以 raise,在本例中为 10,乘以 100+raise
  • 您不必 hard-code raise 因为您将它传递给函数;它允许您在不更改函数的情况下传递 515 或其他一些提升值。

const input = [{ name: "Ali", salary: 3000 }, { name: "Rob", salary: 2000 }, { name: "Adam", salary: 4500 }],
      increment = 10;
      
function raiseSalary(arr, raise) {
    if (arr.length === 0) {
        return [];
    } else {
        return arr.map((salaryObj) => {
            return ({name:salaryObj.name, salary:(salaryObj.salary / 100) * (100+raise)});
        });
    }
}

console.log( raiseSalary(input, increment) );

或者...

只return修改后的数组,不检测元素,也可以使用对象解构。

const input = [{ name: "Ali", salary: 3000 }, { name: "Rob", salary: 2000 }, { name: "Adam", salary: 4500 }],
      increment = 10;
      
function raiseSalary(arr, raise) {
    return arr.map(({name,salary}) => {
        return ({name, salary: salary/100*(100+raise)});
    });
}

console.log( raiseSalary(input, increment) );
console.log( raiseSalary([], increment) );

这是一个使用 map 和对象传播的简单方法:

const updateSalaries = (people, pct) => people .map (({salary, ...rest}) => ({
  ...rest,
  salary: Math .round (salary * (100 + pct) / 100)
}))

const people = [{name: "Ali", salary: 3000}, {name: "Rob", salary: 2000}, {name: "Adam", salary: 4500}]

console .log (updateSalaries (people, 10))
.as-console-wrapper {max-height: 100% !important; top: 0}

对于每个元素,我们解构输入以从对象的其余部分提取 salary,然后创建一个包含其余部分的新结果,但薪水是根据原始薪水和百分比计算得出的调整。