如何将对象的值作为数组,给定键列表?

时间:2017-08-29 09:02:59

标签: javascript performance underscore.js lodash

我有一个如下对象,

obj = {
  '1': {val: 1},
  '2': {val: 2},
  '3': {val: 3},
  '4': {val: 4},
  ...
}

给定键列表(作为Array),我想获取所有值列表(作为Array)。

例如,

如果密钥列表为['3', '4'],则输出为[{val: 3}, {val: 4}]

我尝试如下

_.values(_.pick(obj, ['3', '4']))

这可行,但它会进行两次迭代。有没有办法在一次迭代中实现相同的目标。提前谢谢。

2 个答案:

答案 0 :(得分:5)

要使用_.at()

从Lodash中的选定对象道具创建值数组



var obj = {
  '1': {val: 1},
  '2': {val: 2},
  '3': {val: 3},
  '4': {val: 4}
};

var result = _.at(obj, ['3', '4']);

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

对于像从对象中选择一些属性这样简单的事情,为什么不使用普通的JS?

&#13;
&#13;
const obj = {
  '1': { val: 1 },
  '2': { val: 2 },
  '3': { val: 3 },
  '4': { val: 4 }
}
const keys = ['1', '3'];
const result = [];

for (let i = 0; i < keys.length; i++) {
  obj[keys[i]] && result.push(obj[keys[i]]);
}

console.log(result);
&#13;
&#13;
&#13;

它不会比那更快。特别是对于像lodash这样的库,需要多次迭代才能涵盖你永远不必烦恼的各种角落案例。

或者,通过将对象访问存储在临时变量中更快,感谢@KoushikChatterjee

&#13;
&#13;
const obj = {
  '1': { val: 1 },
  '2': { val: 2 },
  '3': { val: 3 },
  '4': { val: 4 }
}
const keys = ['1', '3'];
const result = [];
let temp;

for (let i = 0; i < keys.length; i++) {
    (temp = obj[keys[i]]) && result.push(temp);
}

console.log(result);
&#13;
&#13;
&#13;