2015-09-02 48 views
0

我正在尝试使用出现在两​​个数组中的键来匹配一些值。这些键不是唯一的,并且可以在每个阵列中出现多次。我想根据sets数组中出现的顺序来匹配它们。下面是我在哪里,在现在:使用非唯一的“键”匹配数组中的对象

var master = [{name: 'title1', value: 1}, {name: 'title1', value: 2}, {name: 'title2', value: 10}, {name: 'title3', value: 11}]; 
 

 
var sets = [{titles: ['title1', 'title2'], index: 1}, {titles: ['title1', 'title3'], index: 2}]; 
 

 

 
for (var x = 0; x < sets.length; x++) { 
 
    var set = sets[x]; 
 
\t for (var i = 0; i < set.titles.length; i++) { 
 
     var title = set.titles[i]; 
 
     var real_index = 
 
     var value = master.filter(function(o){return o.name == title;})[real_index] 
 
     console.log("set: " + set.index + " title: " + title + " value: " + value.value); 
 
    }; 
 
} 
 

 
/* 
 
looking for console output to be: 
 
set: 1 title: title1 value: 1 
 
set: 1 title: title2 value: 10 
 
set: 2 title: title1 value: 2 
 
set: 2 title: title3 value: 11 
 
*/

所以,基本上我需要的变量“real_index”对应于主数组中的对象,但只能使用每个主数组对象一次。假定主数组是不可变的。

我试图让real_index = 0,但这使得它每次(清楚地)返回第一个元素。例如,我试图让real_index = x - 1,但对于title3不起作用。有点难倒。

其他详细信息: - 在sets数组中,标题可以出现在多个集合中,但它们可能不会出现在任何单个集合中多次。 - 在生产中,主数组将非常大,并且将被多次使用,因此假定复制/转换它不会被合理地完成。

+0

为什么不只是改变你的'master'的数组键关闭'name'字典?例如:{{title1:[1,2],title2:[10],title3:[11]}',并在您使用它们时从数组中移除项目。 –

+0

是的,我想到了这一点,但主阵列在制作中会变得非常大,我正在寻找更优雅的解决方案。因为我将不得不多次运行转换代码。 (主数组用于代码的其他部分)。想知道是否有更简洁的做法。 –

+0

'但master数组在生产中会变得非常大,并且您认为搜索整个数组以匹配键是更好的解决方案吗?这取决于你需要访问的频率是多少,但是为了更快速的查找,一次转换的成本可能是值得的。 –

回答

0

如果主人真的很长,你应该只通过主人一次,并为每一个看成套。

var master = [{name: 'title1', value: 1}, {name: 'title1', value: 2}, {name: 'title2', value: 10}, {name: 'title3', value: 11}]; 

var sets = [{titles: ['title1', 'title2'], index: 1}, {titles: ['title1', 'title3'], index: 2}]; 


for (var x = 0; x < master.length; x++) { 
    var value = master[x]; 
    var sets_in = sets.filter(function(o){return o.titles.indexOf(value.name) !== -1;}) 
    for (var i = 0; i < sets_in.length; i++) { 
     console.log("set: " + sets_in[i].index + " title: " + value.name + " value: " + value.value); 
    } 
} 

小提琴:https://jsfiddle.net/rgtdbo40/

这是你在找什么?这个命令是否嘟??

+0

订单确实很重要,看起来您的解决方案会创建额外的迭代。我们应该只有迭代等于集合中标题数组的总和。在我的示例中,它是4.您的代码导致12个控制台日志。 –

+0

对不起,我错过了。这个小提琴更精确吗? https://jsfiddle.net/qje5zhs0/ – AxelWass

0

这是我想出来的。我真的不想处理一本字典。不过,我需要对两个解决方案进行基准测试,以了解性能影响(如果有的话)。

var master = [{name: 'title1', value: 1}, {name: 'title1', value: 2}, {name: 'title2', value: 10}, {name: 'title3', value: 11}]; 
 

 
var sets = [{titles: ['title1', 'title2'], index: 1}, {titles: ['title1', 'title3'], index: 2}]; 
 

 

 
for (var x = 0; x < sets.length; x++) { 
 
    var set = sets[x]; 
 
\t for (var i = 0; i < set.titles.length; i++) { 
 
     var title = set.titles[i]; 
 
     var real_index = sets.filter(function(o){return o.titles.indexOf(title) != -1;}).map(function(o){return o.index;}).indexOf(set.index); 
 
     var value = master.filter(function(o){return o.name == title;})[real_index] 
 
     console.log("set: " + set.index + " title: " + title + " value: " + value.value); 
 
    }; 
 
}