使用非唯一的"键匹配数组中的对象"

时间:2015-09-02 19:58:50

标签: javascript arrays

我试图使用出现在两​​个数组中的键来匹配一些值。键不是唯一的,可以在每个数组中出现多次。我想根据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];
	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
*/
&#13;
&#13;
&#13;

所以,基本上我需要变量&#34; real_index&#34;对应于主数组中的对象,但只使用每个主数组对象一次。假设主数组是不可变的。

我试图使real_index = 0,但这使得它每次(明确地)返回第一个元素。我尝试过make_index = x - 1,但这并不适用于title3。有点难过。

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

2 个答案:

答案 0 :(得分: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/

这是你在找什么?订单是否在嘀咕?

答案 1 :(得分:0)

这就是我想出来的。我真的不想处理字典。我需要对这两种解决方案进行基准测试,看看有什么性能影响。

&#13;
&#13;
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];
	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);
    };
}
&#13;
&#13;
&#13;