当前位置: 首页 > 面试题库 >

将对象的所有键都转换为小写的最佳方式(最有效)是什么?

艾俊悟
2023-03-14
问题内容

我想出了

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()) { // might already be in its lower case version
        obj[key.toLowerCase()] = obj[key] // swap the value to a new lower case key
        delete obj[key] // delete the old key
    }
  }
  return (obj);
}

但是我不确定v8的行为如何,例如,它将真正删除其他键还是仅删除引用,然后垃圾收集器稍后会咬我?

另外,我创建了这些测试,希望您可以在此处添加答案,以便我们了解它们的匹配情况。

编辑1:
显然,根据测试,如果我们不检查键是否已经为小写字母,则速度会更快,但撇开速度来看,如果忽略此键并仅创建新的小写键,会不会造成混乱?垃圾收集者对此感到满意吗?


问题答案:

我想出的最快的方法是创建新对象:

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

我对v8的当前内部工作还不太熟悉,无法为您提供明确的答案。几年前,我观看了一个视频,其中开发人员讨论了对象,而IIRC只会删除引用,并让垃圾收集器来处理它。但是那是几年前的事,所以即使那时是那样,现在也不必那样。

以后会咬你吗?这取决于您在做什么,但可能并非如此。创建寿命很短的对象非常普遍,因此对代码进行了优化以对其进行处理。但是每种环境都有其局限性,也许会刺痛您。您必须测试实际数据



 类似资料:
  • 问题内容: 说我有: 现在,我要将int值转换为String。哪种方法更有效? 我只是好奇是否有真正的区别,或者一个比另一个更好? 问题答案: 测试了10m分配的数字10 一个似乎赢了 编辑:JVM是Mac OS X 10.5下的标准’/ usr / bin / java’ 更多编辑: 要求的代码 情况2和3同样 使用

  • 问题内容: 我想知道将Java对象转换为xml的最佳或最广泛使用的api是什么。我在这个话题上还很新。您可以通过某种API调用来传递对象并返回xml吗?还是在需要通过拉出对象值来手动构造文档的地方更加繁琐? 我一直在阅读有关xerces,sax和jaxb的信息。我想继续沿着这条开源路线走。 谢谢! 问题答案: JAXB 绝对 是 解决方案。 为什么?好吧,它 位于JDK 6中 ,因此您永远不会发现

  • 问题内容: 除了遍历所述集合的内容并将每个项目手动推入数组之外,是否有更有效的方法将HTMLCollection转换为数组? 问题答案: var arr = Array.prototype.slice.call( htmlCollection ) 使用“本地”代码将具有相同的效果。 编辑 由于这有很多观点,请注意(按@oriol的评论),以下更简洁的表达 实际上 等效: 但是,请注意@JussiR

  • 问题内容: 我有一个简单的任务需要在Python中执行,该任务是将字符串转换为所有小写字母,并去除所有非ASCII非字母字符。 例如: 我有一个简单的功能可以做到这一点: 但是我不禁想到有一种更有效或更优雅的方法。 谢谢! 编辑: 感谢所有回答。我学会了,并且在某些情况下重新学习了很多python。 问题答案: 另一个解决方案(不是pythonic,但速度非常快)是使用string.transla

  • 问题内容: 我们的应用程序必须以最少的远程http请求显示大量数据,因此我们在后端添加了一个终结点,该终结点将所有必要的数据作为单个json响应提供。这导致〜1.5MB(压缩)或大约8MB的未压缩json格式的文本。 没什么大问题,它会在10到30秒内下载完毕,我们正在使用ASIHTTPRequest将整个响应写入磁盘。 现在来了有趣的部分-将未压缩的文件读入内存映射的字符串后,我们使用stig的

  • 在我的应用程序中,我正在将java.concurrent.future转换为Twitter Future,如下所示: 这是正确的做法吗,或者有更好的方法吗?