我在表单中快速搜索了我的问题,this post基本上涵盖了一个方面。我只是在寻求解决方案的建议。
基本上,我在对象数组中有一个名称 - 值对列表
[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}] etc etc
假设我们有100个,我想搜索1,这样做的一种方法(链接帖子中接受的答案)如下:
var data = [{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}];
for(var i=0;i<data.length;i++){
if(data[i]['name'] == 'name2'){
console.log('The value is: ' + data[i]['value']);
break;
}
}
我的问题是,如果我想找到两个值怎么办?除了再次遍历数组寻找第二个值之外,还有更有效的方法吗?比如我们想要搜索name1和name2。我在考虑以下几点:
var data = [{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}];
for(var i=0;i<data.length;i++){
var x = 0;
if(data[i]['name'] == 'name1' || data[i]['name'] == 'name2'){
if (data[i]['name'] == 'name1'){
console.log('The value for name 1 is: ' + data[i]['value']);
x++
}
if (data[i]['name'] == 'name2'){
console.log('The value for name 2 is: ' + data[i]['value']);
x++
}
if (x == 2)
{
break;
}
}
}
这样我们只能循环遍历数组一次并且在找到两者时仍然会断开。这似乎是最好的方法,还是会有更有效的解决方案?
答案 0 :(得分:1)
我会在数组上使用filter
来执行此操作,它更容易阅读:
var data = [
{ name: 'name1', value: 'value1' },
{ name: 'name2', value: 'value2' }
];
var result = data.filter(function(item) {
return item.name === 'name1' || item.name === 'name2';
});
答案 1 :(得分:1)
您可以使用Map
在O(1)时间内查找值,而不是在O(n)中从data
构造O(n)时使用var data = [{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}];
var map = new Map(data.map(function (obj) {
return [obj.name, obj.value];
}));
console.log(map.get('name1'));
console.log(map.get('name2'));
n)时间:
import re
count = sum(1 for _ in re.finditer('(dance[^\\w])', line))
print(count)
&#13;
答案 2 :(得分:0)
对于只有一次查找,可以在解析过程中检索这些值:
var data = [], j = `[{"name":"name1","value":"value1"},
{"name":"name2","value":"value2"}, {"name":"name3","value":"value3"}]`
JSON.parse(j, function(key, value) {
if (value.name === 'name1' || value.name === 'name2') data.push(value);
return value; })
console.log( data )
&#13;
对于多次查找,生成查找对象的效率更高:
var names={}, j = '[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}]'
JSON.parse(j, function(key, value) {
if (value.name !== void 0) names[value.name] = value.value;
return value; })
console.log( names.name1, names["name2"] )
console.log( names )
&#13;