在前端开发中,我们经常需要在 JavaScript 中进行对象的转换。其中一个常见的操作是将一个二维数组转换成对象。ES6 中,我们可以使用 Object.entries() 方法将对象转换成一个键值对数组,但是如何将一个键值对数组转换成对象呢?
在 ES10 中,一个新的方法 Object.fromEntries() 被引入,用于将一个键值对数组转换成对象。但是,这种方法并不完美,本文将深入讨论这种方法的优点和缺点,并给出正确的用法指导。
Object.fromEntries() 基本用法
Object.fromEntries() 方法接收一个键值对数组作为参数,然后返回一个新的对象。例如,我们可以通过以下代码将一个二维数组转换成对象:
const entries = [ ["name", "Alice"], ["age", 30] ]; const obj = Object.fromEntries(entries); console.log(obj); // { name: "Alice", age: 30 }
可以看出,Object.fromEntries() 方法非常简单易用,它可以很方便地将一个键值对数组转换成对象。但是,在实际应用中,我们需要注意一些问题。
缺失的告警信息
当键值对数组中存在重复的键时,Object.fromEntries() 方法将会覆盖之前的键值对。例如:
const entries = [ ["name", "Alice"], ["age", 30], ["name", "Bob"] ]; const obj = Object.fromEntries(entries); console.log(obj); // { name: "Bob", age: 30 }
在这个例子中,原本的键值对数组中有两个 name 字段,当转换为对象时,后者覆盖了前者。这在实际应用中很可能是我们不希望看到的结果。但是,Object.fromEntries() 方法并没有任何告警或者错误信息。
因此,我们需要自己进行一些判断,确保传入的键值对数组中不存在重复的键。例如,可以使用 Set() 对键进行去重:
-- -------------------- ---- ------- ----- ------- - - -------- --------- ------- ---- -------- ------ -- ----- -------- - ------- ---------------------- ------- -- -------------- -- - ------ ----- ------------------- --- -- - --- ------------- --- -- ---- --- ----- --- - ----------------------------- ----------------- -- - ----- --------- ------- ---- -- -展开代码
在这个例子中,我们首先用 map() 方法将键数组去重,然后再用 filter() 方法筛选出每个键对应的值数组。最后,我们将它们发送给 fromEntries 方法,得到一个正确的对象。
对象转换的安全
Object.fromEntries() 方法有一个非常方便的用法,就是用于从一个对象中提取指定的属性,得到一个新的对象。例如:
const obj = { name: "Alice", age: 30, address: "Beijing" }; const picked = Object.fromEntries(Object.entries(obj).filter(([key, value]) => key !== "address")); console.log(picked); // { name: "Alice", age: 30 }
在这个例子中,我们先使用 Object.entries() 方法将对象转换成数组,然后使用 filter() 方法过滤出不需要的属性,最后用 Object.fromEntries() 将数组转换成对象。这个方法非常实用,可以帮助我们快速地将一个对象转换成另一个对象。
然而,需要注意的是,如果原对象中存在一些我们不希望暴露的属性,那么这种转换方法会将它们放在新对象中。为了解决这个问题,我们需要使用 Object.assign() 方法,将新对象中的属性合并到一个空对象中:
const obj = { name: "Alice", age: 30, address: "Beijing" }; const picked = Object.assign({}, Object.fromEntries(Object.entries(obj).filter(([key, value]) => key !== "address"))); console.log(picked); // { name: "Alice", age: 30 }
在这个例子中,我们使用 Object.assign() 将新对象中的属性合并到一个空对象中,这样就可以避免原对象中不需要的属性被暴露出去了。
总之,Object.fromEntries() 方法是一个非常实用的工具,可以帮助我们将键值对数组快速地转换成对象。但是,在使用这个方法时,需要注意一些问题,尤其是键值对中存在重复的键的情况下。除此之外,我们还可以使用这个方法来提取对象中的指定属性,但是需要注意保护原对象中的属性安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bc5f11a231b2b7eddeeb71