如何在 ES6 中相乘对象值并保留它们的键

kno*_*t22 1 javascript

我有以下包含转换因子的对象:

  const convertToYards =
  {
    "feet": 3,
    "meters": 0.9144,
    "yards": 1
  }
Run Code Online (Sandbox Code Playgroud)

然后有一个变量保存一个数字,如下所示: const maximumYards = 500;

我试图找出一种方法将所有值乘以convertToYards数字,maximumYards以便创建一个新对象,如下所示:

  const maximums =
  {
    "feet": 1500,
    "meters": 457.2,
    "yards": 500
  }
Run Code Online (Sandbox Code Playgroud)

我试过这个

const maximums = Object.values(convertToYards).map(o => o * maximumYards);
Run Code Online (Sandbox Code Playgroud)

但这会创建一个数组而不是一个对象,因此它不会携带原始的键名称。应该如何修改以获得所需的输出?

T.J*_*der 5

您可以通过组合Object.entries(获取数组)、map(映射值)和Object.fromEntries(再次获取对象)来完成此操作:

const maximums = Object.fromEntries(
    Object.entries(convertToYards).map(([name, value]) => [name, value * maximumYards])
);
Run Code Online (Sandbox Code Playgroud)

const maximums = Object.fromEntries(
    Object.entries(convertToYards).map(([name, value]) => [name, value * maximumYards])
);
Run Code Online (Sandbox Code Playgroud)

或者只是使用for-in循环;convertToYards不过,如果可能的话,您可能需要清除继承的属性:

const maximums = {};
for (const name in convertToYards) {
    maximums[name] = convertToYards[name] * maximumYards;
}
Run Code Online (Sandbox Code Playgroud)

const convertToYards = {
    "feet": 3,
    "meters": 0.9144,
    "yards": 1
};

const maximumYards = 500;

const maximums = Object.fromEntries(
    Object.entries(convertToYards).map(([name, value]) => [name, value * maximumYards])
);

console.log(maximums);
Run Code Online (Sandbox Code Playgroud)

中间立场是keys与以下一起使用for-of

const maximums = {};
for (const name of Object.keys(convertToYards)) {
    maximums[name] = convertToYards[name] * maximumYards;
}
Run Code Online (Sandbox Code Playgroud)

const maximums = {};
for (const name in convertToYards) {
    maximums[name] = convertToYards[name] * maximumYards;
}
Run Code Online (Sandbox Code Playgroud)

  • @AyushGupta - 我不喜欢使用预定义的、可重用的、经过测试的减速器函数的函数式编程之外的“reduce”。只是太难阅读和维护,太容易出错。当累加器值永远不会改变时,也不喜欢“reduce”(在这种情况下,它总是相同的对象引用)。但是,是的,这是可能的。:-) (3认同)