用于获取对象值的有序数组的 Javascript (lodash) 函数

标签 javascript arrays performance function lodash

(上面的标题可能会产生误导,我愿意接受有关如何改进它的建议。)

我想要的是一个函数,它将一个Array 和一个Object 作为参数,并生成一个数组,其中包含按数组指定的顺序排列的对象的值。 IE。第一个参数(数组)可以被认为是一个模式,它定义了对象的值应该存储在结果数组中的顺序。

即:

var arrPersonSchema = [
  'name',
  'age',
  'height'
];

var objPerson = {
  'name': 'fred',
  'age': 35,
  'height': 60
};

var objPerson2 = {
  'age': 22,
  'name': 'jane'
};

function orderedValues(arrSchema, obj) {
  var arrResult = [];
  for(var i = 0; i < arrSchema.length; i++) 
    arrResult[i] = obj[arrSchema[i]];
  return arrResult;
}

orderedValues(arrPersonSchema, objPerson);
// → [ 'fred', 35, 60]

orderedValues(arrPersonSchema, objPerson2);
// → [ 'jane', 22, undefined]

显然上面的代码产生了预期的结果,但我的问题是是否有更有效(更快)的方法使用 lodash 或类似的性能增强的 javascript 库(甚至是快速的 native 实现)来实现相同的结果).

从某种 Angular 来看,我要求的是 lodash 函数 _.zipObject 的双数组形式的 .该函数有两种形式:

(A) 采用单个二维数组(这是 _.pairs 的倒数)

_.zipObject( [['fred', 30], ['barney', 40]] );
// → { 'fred': 30, 'barney': 40 }

(B) 接受两个一维数组:(这是我想要的逆数组)

_.zipObject( ['fred', 'barney'],  [30, 40] );
// → { 'fred': 30, 'barney': 40 }

我指的是第二种。例如,可以使用它在给定模式数组和值数组的情况下生成一个对象。即:

_.zipObject(arrPersonSchema, ['fred', 35, 60]);
// → { 'name': 'fred',  'age': 35,  'height': 60 }

注意 lodash 函数 _.values 不是可接受的答案。虽然它确实会生成一个值数组,但值的顺序“无法保证”。我正在寻找的函数的重要方面是结果数组中值的顺序由架构明确定义,并且不依赖于任何隐式顺序对象内的属性(例如,基于构造对象的方式等)或函数的任何非官方实现细节等。

更新

感谢所有回复的人。我对 Bergi 的建议感到惊讶,即我的实现(我认为是“幼稚的”)可能是最快的选择。但我采纳了 Bergi 的建议,并对我收到的 4 条建议进行了基准测试。这些结果绝不是权威的。我只是使用了 Chrome DevTools Javascript CPU 分析器并为每个运行了 100000 次试验(每次试验 3 个不同的对象)。你可以看到我用来设置基准的 Plunker here .

结果如下:

simpleLoop:   393 ms
lodashAt:     917 ms
nativeMap:    719 ms
modArgs:    13741 ms
  • simpleLoop 是我写的函数(又名 orderedValues)
  • lodashAtAdam Boduch建议的lodash函数_.at()
  • nativeMapKlaster_1推荐的函数的ES5版本
  • modArgs 是函数 Bergi列出(注意它可能不会比我的函数快。)

我有点不确定选择谁的答案,因为我实际上同时提出了几个不同的问题。 Adam Boduch 给出了最好的基于 lodash 的答案,这正是我一直在寻找的 zipObject 函数的“逆”。 Bergi 的 lodash 函数没有那么简洁(结果证明它慢得多)。但是,Bergi 指出我的简单 orderedValues 函数可能是最快的,他是对的。回顾我的问题,尤其是包含“……我的问题是是否有更有效(更快)的方法……”的那一行,看来 Bergi 实际上回答得最好,他指出确实没有这是一种比我提出的方法更快的方法。因此,尽管 Adam Boduch 的回答准确无误,但我还是决定选择 Bergi 的回答。再次感谢大家!

最佳答案

我会使用 at()为此:

_.at(objPerson, arrPersonSchema);
// → ["fred", 35, 60]

_.at(objPerson2, arrPersonSchema)
// → ["jane", 22, undefined]

关于用于获取对象值的有序数组的 Javascript (lodash) 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870139/

相关文章:

javascript - RiotJS : How to cache values during loops?

ruby - 如果还没有的话,是否有 Ruby 习惯用法可以将对象封装在数组中?

C 动态内存与堆栈内存变量

android - 将多个图像后台上传到 Parse Server Android Java

javascript - 为什么 moment-timezone 不适用于给定的时区

javascript - 如何在 Circle 类之上实现 Shape 类?

javascript - 为什么 jQuery 选择器不能工作但 getElementById 在这种情况下工作?

arrays - 为什么禁止内置 "braced-init-list"中的 "operator[]"?

java - 计算字符串中字符的频率(Java,性能)

r - 在 R 中有效地创建向量的困惑