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>操作符