Javascript 对象[key]满足先决条件的每个键

Javascript 对象[key]满足先决条件的每个键,javascript,javascript-objects,Javascript,Javascript Objects,我想访问嵌套对象中满足条件的所有第二级元素,而不知道第一级键 例如: myObject = { foo: { element_one : 1, element_two : 1, ... }, bar: { element_one : 3, element_two : 4, ... }, buzz: { element_one : 99, element_two : 100

我想访问嵌套对象中满足条件的所有第二级元素,而不知道第一级键

例如:

myObject = {
   foo: {
      element_one : 1,
      element_two : 1,
      ...
   },
   bar: {
      element_one : 3,
      element_two : 4,
      ...
   },
   buzz: {
      element_one : 99,
      element_two : 100,
      ...
   },
   ...
} 
在上面的示例中,我希望能够有效地抓取所有第一级键,其中
myObject..element\u one===某个\u编号

一个明显的解决方案是遍历列表并检查每个元素,但如果多次调用此函数,则计算成本会很高。作为备份,我可以创建一个keys=element\u one的新对象,并将其用作引用

但我很想知道是否有更好的方法来处理这个问题

编辑:
我不知道元素的最大值可能是什么。

类似的东西可以工作:

var obj = <YOUR_OBJ>
var final_keys = [];

for(key in obj)
{
 if(a[key].element_one == 1){
   final_keys.push(key);
 }
}
console.log(final_keys);
var obj=
var final_keys=[];
用于(输入obj)
{
if(a[key].element_one==1){
最终按键。按下(按键);
}
}
控制台日志(最终_键);

您可以使用
Object.keys
获取对象的第一级密钥数组,并使用
array.prototype.filter
在第一级密钥之间进行筛选,第二级密钥具有指定的编号:

myObject={
傅:{
第一部分:1,
要素二:1
},
酒吧:{
第一部分:3,
第二部分:4
},
嗡嗡声:{
元素一:99,
元素二:100
}
} 

log(Object.keys(myObject.filter)(key=>myObject[key].element_one==99))所以我将给出两种不同的解决方案

1) 您将获得匹配键的数组

2) 您将获得一个带有匹配键(及其关联值)的新对象

const myObject={
傅:{
第一部分:1,
要素二:1,
},
酒吧:{
第一部分:3,
要素二:4,
},
狗:{
第一部分:1,
要素二:4,
},
嗡嗡声:{
第一部分:1,
元素二:100,
},
}
const matchingKeys=Object.keys(myObject.filter)(key=>{
返回myObject[key]。元素_one==1
})
//第一种解决方案:如果您只需要匹配的密钥
console.log(匹配键)
const objectWithMatchingKeys=Object.keys(myObject).reduce((acc,val)=>{
if(myObject[val]。element_one==1)acc[val]=myObject[val]
返回acc
}, {})
//第二种解决方案:如果希望对象具有匹配的关键点

console.log(objectWithMatchingKeys)
感谢大家的回复。 我认为,考虑到我对任何元素的最小/最大值没有任何控制或知识,它们不一定是有序的;Bergi和RK_oo7的评论是正确的。最有效的解决方案是遍历列表一次,并缓存元素值以备将来使用

大概是这样的:

var elementIndex = {};
Object.entries(myObject).forEach(([key, val]) => {
  if (val.element_one in elementIndex) {
     elementIndex[val.element_one].push(key);
  } else {
     elementIndex[val.element_one] = [key];
  }
});

是的,迭代是您选择的数据结构的唯一解决方案。如果确实需要经常这样做,请维护一个单独的数据结构,该结构具有从数字到键列表(或对象本身)的
映射。对于您描述的“多个调用”,这将具有最佳性能。我想不出其他任何东西,因为您没有声明该结构的任何其他属性@Bergi建议缓存该结果,这样您就可以避免在m调用上重复工作,但请注意O(m*n)=O(n).OP已经知道:“一个明显的解决方案是遍历列表并检查每个元素”有趣的注释。但不幸的是,我不知道一个元素的数字范围是多少。考虑到这一点,维护第二个数据结构可能是一个更好的解决方案。OP已经知道:“一个明显的解决方案是迭代列表并检查每个元素”。我认为您可以对Object.values()使用条件,并使用array indexOf函数进行检查。更多信息,请让我知道你想要什么样的条件?