[英]Efficient name value pairs extraction from array of objects using JavaScript
I did a quick search for my question in the forms and this post basically covers it all apart from one aspect. 我以表格的形式快速搜索了我的问题, 这篇文章从一个方面基本上涵盖了所有问题。 I am just looking some advice on the proposal of a solution. 我只是在寻找解决方案建议的一些建议。
Basically, I have a list of name-value pairs in an array of objects 基本上,我在对象数组中有一个名称/值对列表
[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}] etc etc
Say we have 100 of these and I want to search for 1, one way to do this (the accepted answer in the linked post) would be as below: 假设我们有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;
}
}
My question is, what if I want to find two values? 我的问题是,如果我想找到两个值怎么办? Is there a more efficient way to do this other than looping through the array again looking for the second value? 除了再次遍历数组以查找第二个值以外,还有其他更有效的方法吗? Say for example we were wanting to search for name1 AND name2. 举例来说,我们要搜索name1和name2。 I was thinking of something along the lines of: 我在想一些类似的事情:
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;
}
}
}
This way we would only be looping through the array once and still breaking when both are found. 这样,我们只会在数组中循环一次,而在找到两者时仍会中断。 Does this seem the best way to do it or would there be a more efficient solution? 这似乎是最好的方法,还是会有更有效的解决方案?
I would use filter
on the array to do it, it's a bit easier to read: 我会在数组上使用filter
来做到这一点,它更容易阅读:
var data = [
{ name: 'name1', value: 'value1' },
{ name: 'name2', value: 'value2' }
];
var result = data.filter(function(item) {
return item.name === 'name1' || item.name === 'name2';
});
You can use a Map
to look up values in O(1) time instead of using an Array
in O(n) time after constructing it from the data
in O(n) time: 从O(n)时间中的data
构造出来后,可以使用Map
在O(1)时间中查找值,而不是在O(n)时间中使用Array
:
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'));
For only one lookup, the values can be retrieved during the parsing: 仅需一次查找,就可以在解析过程中检索这些值:
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 )
For multiple lookups, it's more efficient to generate a lookup object: 对于多次查找,生成查找对象更为有效:
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 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.