Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在给定键列表的情况下,如何以数组形式获取对象的值?_Javascript_Performance_Underscore.js_Lodash - Fatal编程技术网

Javascript 在给定键列表的情况下,如何以数组形式获取对象的值?

Javascript 在给定键列表的情况下,如何以数组形式获取对象的值?,javascript,performance,underscore.js,lodash,Javascript,Performance,Underscore.js,Lodash,我有一个目标如下: obj = { '1': {val: 1}, '2': {val: 2}, '3': {val: 3}, '4': {val: 4}, ... } 给定键列表(作为数组),我想获取所有值列表(作为数组) 比如说, 如果键列表是['3',4'],则输出将是[{val:3},{val:4}] 我试了以下方法 _.values(_.pick(obj, ['3', '4'])) 这是可行的,但需要两次迭代。有没有办法在一次迭代中达到同样的效果。提前感谢。要从选

我有一个目标如下:

obj = {
  '1': {val: 1},
  '2': {val: 2},
  '3': {val: 3},
  '4': {val: 4},
  ...
}
给定键列表(作为
数组
),我想获取所有值列表(作为
数组

比如说,

如果键列表是
['3',4']
,则输出将是
[{val:3},{val:4}]

我试了以下方法

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

这是可行的,但需要两次迭代。有没有办法在一次迭代中达到同样的效果。提前感谢。

要从选定对象本体创建值数组,请使用:

var obj={
'1':{val:1},
'2':{val:2},
'3':{val:3},
'4':{val:4}
};
var结果=u.at(obj,['3','4']);
控制台日志(结果)

要从选定对象本体创建值数组,请使用:

var obj={
'1':{val:1},
'2':{val:2},
'3':{val:3},
'4':{val:4}
};
var结果=u.at(obj,['3','4']);
控制台日志(结果)

对于从一个对象中选取几个属性这样简单的事情,为什么不直接使用纯JS呢

const obj={
'1':{val:1},
'2':{val:2},
'3':{val:3},
'4':{val:4}
}
常量键=['1','3'];
常量结果=[];
for(设i=0;i控制台日志(结果)对于像从对象中选取几个属性这样简单的东西,为什么不直接使用纯JS呢

const obj={
'1':{val:1},
'2':{val:2},
'3':{val:3},
'4':{val:4}
}
常量键=['1','3'];
常量结果=[];
for(设i=0;i控制台日志(结果)
.map(['3','4',key=>obj[key])RaR,您是否意识到,在引擎盖下,
.value
.pick
2
迭代并不接近?我猜它更接近
10
。同样适用于任何在其位置使用的lodash方法。@Cerbrus是吗?我的印象是,它是以这样一种方式优化的,它只需要一次迭代就可以完成这样的操作。所以我总是喜欢lodash:(我猜在使用任何lodash方法之前,我必须先查看源代码。@RaR,这样想:lodash需要考虑兼容性问题和各种可能的输入值类型。最后,执行的都是简单的JS,只是有一堆你真的不需要的额外内容。lodash的吸引力在于shorter,更具可读性的代码。但这并不能使它执行得更快;-)\map(['3','4'],key=>obj[key])RaR,你知道吗,在引擎盖下,
.value
.pick
2
迭代并不接近吗?我猜它更接近
10
。对于你在它的位置上使用的任何lodash方法都是一样的。@Cerbrus是吗?我的印象是,它被优化了,只需要一次迭代就可以完成完成这样的操作。所以我总是喜欢lodash:(我猜在使用任何lodash方法之前,我必须先查看源代码。@RaR,这样想:lodash需要考虑兼容性问题和各种可能的输入值类型。最后,执行的都是简单的JS,只是有一堆你真的不需要的额外内容。lodash的吸引力在于shorter,更可读的代码。但这并不能让它执行得更快;-)非常好的解决方案,我很感激+1^^,假设我们可以做一些类似
temp=obj[keys[I]&&result.push(temp)
那么它会快一点,因为我们两次从对象中按键获取
,从数组键中按索引获取
@KoushikChatterjee:我喜欢这个主意,但这不管用:
让temp=obj[keys[I]&&result.push(temp);
->
未捕获引用错误:未定义temp
。您将无法访问
temp
,因为在尝试推送它时未声明它。使用
var
而不是
let
不会引发错误,但仍然无法正常工作。不,将temp声明为loop@KoushikChatterjee:那么结果是我s:
[undefined,1]
,类似于使用
var
。不,不,我只是动态编写,没有执行,只需尝试这个
(temp=obj[keys[I]]&&result.push(temp)
,使用
(…)
当以其他方式分配时,
&&
将首先执行,然后执行
=
运算符非常好的解决方案,我非常感谢+1^^,假设我们可以执行类似
temp=obj[keys[I]]和&result.push(temp)的操作
那么它会快一点,因为我们两次从对象中按键获取
,从数组键中按索引获取
@KoushikChatterjee:我喜欢这个主意,但这不管用:
让temp=obj[keys[I]&&result.push(temp);
->
未捕获引用错误:未定义temp
。您将无法访问
temp
,因为在尝试推送它时未声明它。使用
var
而不是
let
不会引发错误,但仍然无法正常工作。不,将temp声明为loop@KoushikChatterjee:那么结果是我s:
[undefined,1]
,类似于使用
var
。不不,我只是在运行中编写了,没有执行,只需尝试这个
(temp=obj[keys[I]])和&result。当分配
(…)
时,使用
(…)
按下(temp)
,否则
&
将首先执行
=/code>操作符