2017-04-25 113 views
1

给定下面列出的表单对象,获取包含特定值的键的最佳方法是什么?例如在下面的结构中,如果我们想要拥有property1的所有对象,我们应该得到object1和object2作为答案。 或者这可以存储在特定类型的数据结构中以便快速检索? 在一种方法中遍历所有对象的值。我正在寻找比这更快的东西。将不胜感激建议。JavaScript按值筛选

{ 
     object1: [property1, property2, property3], 
     object2: [property1], 
     object3: [property2] 
} 
+0

琐碎遍历所有属性,并检查indexOf如果该值包含在数组中。如果是这样按键到结果数组。你可以自己做,至少尝试一下。 – dfsq

+0

在这种情况下的时间复杂度将是对象的数量+密钥的数量。任何更好的方法呢? –

回答

0

如果你想实现这一目的的更快的数据结构,那么你可以把你的对象为ES6地图,就像这样:

// Sample object: 
 
var obj = { 
 
    key1: [1, 2, 3], 
 
    key2: [1], 
 
    key3: [2] 
 
}; 
 

 
// Turn into map keyed by values 
 
var m = Object.keys(obj).reduce((m, key) => 
 
    obj[key].reduce((m, v) => m.set(v, (m.get(v) || []).concat(key)), m), 
 
    new Map 
 
); 
 

 
// Example use of the map: 
 
console.log('1 occurs in: ', m.get(1));

0

尝试是这样的

x = { 
 
     object1: ['property1', 'property2', 'property3'], 
 
     object2: ['property1'], 
 
     object3: ['property2'] 
 
} 
 

 
z = Object.keys(x).filter(function(y) { 
 
    return x[y].indexOf('property1') !== -1 
 
}) 
 
console.log(z)

这只是循环和过滤器在你的对象中的每个键,然后做值的阵列上的平等检查。还挺

0
var l = []; 
var dict = {...} 
for (var key in dict) { 
    var obj = dict[key]; 
    if (obj.indexOf("property1") != -1) { 
     l.push(obj); 
    } 
} 

l // Here is the result 
0

只需使用filter()功能在Object.keys(data),并检查是否每个对象都包含的值。如果这就是你想要的价值本身的钥匙,你也可以map()

const data = { 
 
    a: [1,2,3], 
 
    b: [1], 
 
    c: [2] 
 
}; 
 

 
const searchValue = 1; 
 

 
const keysWithValue = Object.keys(data).filter(key => data[key].includes(searchValue)); 
 

 
const objectsWithValue = keysWithValue.map(key => data[key]); 
 

 
console.log(keysWithValue, objectsWithValue);

0

遍历阵列,并且使用这种每一次测试:

if(Obj.hasOwnProperty("<property name>")){ 
array.push(obj); 
} 
return array; 
0

检查这个代码,我认为,它会帮助你:

const list = { 
 
     object1: ['a', 'b', 'c'], 
 
     object2: ['a'], 
 
     object3: ['c'] 
 
} 
 

 
function getData(list, value){ 
 
    return Object.keys(list).filter(item => list[item].indexOf(value) !== -1) 
 
} 
 

 
getData(list, 'a');