在 JavaScript 中为对象创建映射函数
Alex Dulcianu
2023年1月30日
2022年5月1日
-
在 JavaScript 中使用通用
map()
方法为对象创建映射函数 -
使用
for in
循环为 JavaScript 中的对象创建映射函数 - 使用 JavaScript 中对象的自定义映射函数创建新对象
-
在 JavaScript 中使用
Object.entries()
和Object.fromEntries()
为对象创建映射函数 -
在 JavaScript 中使用
Object.entries()
和Object.fromEntries()
编写函数以映射你的对象
在很多情况下,你希望对 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 }