搜索

首页  >  问答  >  正文

最有效的方式是将一个对象的所有键转换为小写字母的方法是什么?

<p>我想出了以下解决方案</p> <pre class="brush:php;toolbar:false;">function keysToLowerCase (obj) { var keys = Object.keys(obj); var n = keys.length; while (n--) { var key = keys[n]; // "cache" it, for less lookups to the array if (key !== key.toLowerCase()) { // 可能已经是小写形式 obj[key.toLowerCase()] = obj[key] // 将值交换到新的小写键 delete obj[key] // 删除旧键 } } return (obj); }</pre> <p>但是我不确定v8会如何处理,例如,它是否真的会删除其他键,还是只会删除引用,然后垃圾回收器会在后面咬我?</p> <p>此外,我创建了这些测试,希望您能在那里添加您的答案,以便我们可以看到它们的匹配情况。</p> <p><strong>编辑1:</strong> 显然,根据测试结果,如果我们不检查键是否已经是小写形式,速度会更快,但是除了速度更快之外,它会通过忽略这一点而创建更多的混乱吗?垃圾回收器会对此满意吗?</p>
P粉066224086P粉066224086468 天前554

全部回复(2)我来回复

  • P粉792026467

    P粉7920264672023-08-23 10:44:49

    使用 Object.fromEntries (ES10)

    使用新的Object.fromEntries方法的本地和不可变解决方案:

    const newObj = Object.fromEntries(
      Object.entries(obj).map(([k, v]) => [k.toLowerCase(), v])
    );
    

    在该函数广泛可用之前,您可以使用以下polyfill自定义定义:

    Object.fromEntries = arr => Object.assign({}, ...Array.from(arr, ([k, v]) => ({[k]: v}) ));
    

    一个好处是,此方法与Object.entries相反,因此现在您可以在对象和数组表示之间来回切换。

    回复
    0
  • P粉258788831

    P粉2587888312023-08-23 00:25:13

    我想到的最快的方法是创建一个新对象:

    var key, keys = Object.keys(obj);
    var n = keys.length;
    var newobj={}
    while (n--) {
      key = keys[n];
      newobj[key.toLowerCase()] = obj[key];
    }

    我对v8的当前内部工作机制不够熟悉,无法给出明确的答案。几年前,我看过一个视频,开发人员在其中讨论了对象,如果我没记错的话,它只会删除引用,并让垃圾收集器处理。但那是几年前的事了,所以即使当时是这样,现在也不一定是这样。

    它会在以后给你带来麻烦吗?这取决于你在做什么,但可能不会。创建短暂对象是非常常见的,所以代码被优化来处理它。但每个环境都有其限制,也许它会给你带来麻烦。你必须使用实际数据进行测试。

    回复
    0
  • 取消回复