在 JavaScript 中为对象创建映射函数

Alex Dulcianu 2023年10月12日
  1. 在 JavaScript 中使用通用 map() 方法为对象创建映射函数
  2. 使用 for in 循环为 JavaScript 中的对象创建映射函数
  3. 使用 JavaScript 中对象的自定义映射函数创建新对象
  4. 在 JavaScript 中使用 Object.entries()Object.fromEntries() 为对象创建映射函数
  5. 在 JavaScript 中使用 Object.entries()Object.fromEntries() 编写函数以映射你的对象
在 JavaScript 中为对象创建映射函数

在很多情况下,你希望对 JavaScript 中的对象执行某些操作。标准库包含实现此目的的各种方法,但这并不意味着涵盖了所有情况。

在这种情况下,没有本地方法可以迭代对象的属性并执行类似于 Array.prototype.map 函数的操作。

因此,如果你想检查每个属性并为其添加特定值,那么你无法使用标准库方法来做到这一点。值得庆幸的是,你可以从头开始创建地图功能并根据需要对其进行自定义。

在 JavaScript 中使用通用 map() 方法为对象创建映射函数

使用本机 map() 函数,此方法可以达到预期的效果。但是,你应该知道,此方法将修改原始对象,而不是创建新对象。

如果你不关心原始对象并且想要结果,那么你可以通过以下方式实现此目的:

let testObject = {'first': 1, 'second': 2, 'third': 3};

Object.keys(testObject).map(function(key, value) {
  testObject[key] += 1
});

console.log(testObject);

输出:

{ first: 2, second: 3, third: 4 }

使用 for in 循环为 JavaScript 中的对象创建映射函数

或者,你也可以使用简单的 for 循环来迭代对象的属性并执行所需的计算。此方法使用 hasOwnProperty() 函数来检查对象是否具有有效属性。

let testObject = {'first': 1, 'second': 2, 'third': 3};

for (var key in testObject) {
  if (testObject.hasOwnProperty(key)) {
    testObject[key] += 1;
  }
}

console.log(testObject);

输出:

{ first: 2, second: 3, third: 4 }

使用 JavaScript 中对象的自定义映射函数创建新对象

如上所述,前一种方法在执行所需操作时会覆盖原始对象。如果你不想这样做,则可以改为创建一个新对象并保持原始对象不变。

Obvisouly,这种方法需要更多的代码,但结果更干净一些。

let testObject = {'first': 1, 'second': 2, 'third': 3};

function customMap(object, mapFn) {
  return Object.keys(object).reduce(function(result, key) {
    result[key] = mapFn(object[key])
    return result
  }, {});
}

let newObject = customMap(testObject, function(value) {
  return value + 1
});

console.log(testObject);
console.log(newObject);

输出:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

输出显示原始对象和具有修改值的新创建对象。如果你好奇,我们使用的 mapFn 参数是 Array.from() 方法的一部分,它被设计为用作映射函数。

在 JavaScript 中使用 Object.entries()Object.fromEntries() 为对象创建映射函数

如果你的项目允许你使用 ES2019 标准而不用担心向后兼容性,你可以减少创建映射函数所需的代码。

此方法的代码如下所示:

let testObject = {'first': 1, 'second': 2, 'third': 3};

let newObject = Object.fromEntries(
    Object.entries(testObject).map(([key, value]) => [key, value + 1]));

console.log(testObject);
console.log(newObject);

输出:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

由于这是一个单线,它可能很难维护,即使它更容易实现。

在 JavaScript 中使用 Object.entries()Object.fromEntries() 编写函数以映射你的对象

假设你想让上面的代码更易于管理和维护。在这种情况下,最简单的解决方案是将 Object.entries()Object.fromEntries() 集成到自定义函数中。

因此,你可以通过以下方式重写前面的代码:

let testObject = {'first': 1, 'second': 2, 'third': 3};

function customMap(object, func) {
  return Object.fromEntries(
      Object.entries(object).map(([key, value]) => [key, func(value)]));
}

let newObject = customMap(testObject, (x) => x + 1);

console.log(testObject);
console.log(newObject);

输出:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

相关文章 - JavaScript Map