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函数进行检查。更多信息,请让我知道你想要什么样的条件?