如何使用javascript将主数据集链接到辅助数据集?

如何使用javascript将主数据集链接到辅助数据集?,javascript,Javascript,我试图用我将从第二个对象查找的元素扩展一个主要对象 主集合如下所示: collection1 = [ {"user":"user1", "category":"cat1", "item":"item2"}, {"user":"user2", "category":"cat2", "item":"item4"} ]; collection2 = { "dateStamp":"2016-12-23", "details":[ {"category":

我试图用我将从第二个对象查找的元素扩展一个主要对象

主集合如下所示:

collection1 = [
    {"user":"user1", "category":"cat1", "item":"item2"},
    {"user":"user2", "category":"cat2", "item":"item4"}
];
collection2 = {
    "dateStamp":"2016-12-23",
    "details":[
        {"category":"cat1", "item":"item1", "attribute":"1"},
        {"category":"cat1", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item3", "attribute":"1"},
        {"category":"cat2", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item4", "attribute":"3"}
    ]
};
collection3 = [
    {"user":"user1", "category":"cat1", "item":"item2", "dt":"2016-12-23", "attribute":"2"},
    {"user":"user2", "category":"cat2", "item":"item4", "dt":"2016-12-23", "attribute":"3"}
];
第二个集合如下所示:

collection1 = [
    {"user":"user1", "category":"cat1", "item":"item2"},
    {"user":"user2", "category":"cat2", "item":"item4"}
];
collection2 = {
    "dateStamp":"2016-12-23",
    "details":[
        {"category":"cat1", "item":"item1", "attribute":"1"},
        {"category":"cat1", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item3", "attribute":"1"},
        {"category":"cat2", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item4", "attribute":"3"}
    ]
};
collection3 = [
    {"user":"user1", "category":"cat1", "item":"item2", "dt":"2016-12-23", "attribute":"2"},
    {"user":"user2", "category":"cat2", "item":"item4", "dt":"2016-12-23", "attribute":"3"}
];
我希望最终结果如下所示:

collection1 = [
    {"user":"user1", "category":"cat1", "item":"item2"},
    {"user":"user2", "category":"cat2", "item":"item4"}
];
collection2 = {
    "dateStamp":"2016-12-23",
    "details":[
        {"category":"cat1", "item":"item1", "attribute":"1"},
        {"category":"cat1", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item3", "attribute":"1"},
        {"category":"cat2", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item4", "attribute":"3"}
    ]
};
collection3 = [
    {"user":"user1", "category":"cat1", "item":"item2", "dt":"2016-12-23", "attribute":"2"},
    {"user":"user2", "category":"cat2", "item":"item4", "dt":"2016-12-23", "attribute":"3"}
];
我想滚动浏览collection1,并在collection2中查找每个记录的属性值。然而,我还没有让它发挥作用;当前查找(查找)方法失败。我显然误用了它。:)

以下代码在注释行失败:

var collection1 = [
    {"user":"user1", "category":"cat1", "item":"item2"},
    {"user":"user2", "category":"cat2", "item":"item4"}
];

var collection2 = {
    "dateStamp":"2016-12-23",
    "details":[
        {"category":"cat1", "item":"item1", "attribute":"1"},
        {"category":"cat1", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item3", "attribute":"1"},
        {"category":"cat2", "item":"item2", "attribute":"2"},
        {"category":"cat2", "item":"item4", "attribute":"3"}
    ]
};

var collection3 = [];

collection1.forEach(function(c){
    c.dateStamp = collection2.dateStamp;
    //c.attribute = collection2.find({"details.category":c.category, "details.item":c.item});
    collection3.push(c);
});

console.log(collection3);
我还认为类似SQL的“join”会更有效。。。但不确定用这些数据是否可行


有人能提供一个工作示例和/或指导来处理这个用例的最优雅的方法吗?谢谢大家!

圣诞节前,希望这有助于:

collection1=[
{“用户”:“用户1”,“类别”:“cat1”,“项目”:“项目2”},
{“用户”:“用户2”,“类别”:“cat2”,“项目”:“项目4”}
];
集合2={
“邮戳”:“2016-12-23”,
“详情”:[
{“类别”:“cat1”,“项目”:“项目1”,“属性”:“1”},
{“类别”:“cat1”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目3”,“属性”:“1”},
{“类别”:“cat2”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目4”,“属性”:“3”}
]
};
函数合并对象(obj1、obj2){
var obj3={};
对于(obj1中的var attrname){obj3[attrname]=obj1[attrname];}
对于(obj2中的var attrname){obj3[attrname]=obj2[attrname];}
返回obj3;
}
函数比较(obj,数组){
var foundIndex=-1;
var maxCount=0;
对于(var index=0;index最大计数){
最大计数=计数;
foundIndex=索引;
}
}
返回数组[foundIndex];
}
var collection3=[];
for(var col1=0;col1使用它可以计算collection2.details中按类别分组的元素数

使用后,可以产生最终结果:

var集合1=[
{“用户”:“用户1”,“类别”:“cat1”,“项目”:“项目2”},
{“用户”:“用户2”,“类别”:“cat2”,“项目”:“项目4”}
];
变量集合2={
“邮戳”:“2016-12-23”,
“详情”:[
{“类别”:“cat1”,“项目”:“项目1”,“属性”:“1”},
{“类别”:“cat1”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目3”,“属性”:“1”},
{“类别”:“cat2”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目4”,“属性”:“3”}
]
};
var hwc2={};
集合2.详细信息.forEach(函数(ele){
hwc2[ele.category]=(hwc2[ele.category]==未定义)?1:hwc2[ele.category]+1;
});
var collection3=collection1.map(函数(val,idx){
var-retVal=val;
retVal['dt']=collection2.邮戳;
retVal['attribute']=hwc2[val.category];
返回返回;
});

控制台日志(收集3)这里有一个更简单的解决方案

ES6 使用
Array#find
方法(注意IE不支持,但您可以使用或a),您可以从
collection2.详细信息中找到所需的数据

var集合1=[
{“用户”:“用户1”,“类别”:“cat1”,“项目”:“项目2”},
{“用户”:“用户2”,“类别”:“cat2”,“项目”:“项目4”}
];
变量集合2={
“邮戳”:“2016-12-23”,
“详情”:[
{“类别”:“cat1”,“项目”:“项目1”,“属性”:“1”},
{“类别”:“cat1”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目3”,“属性”:“1”},
{“类别”:“cat2”,“项目”:“项目2”,“属性”:“2”},
{“类别”:“cat2”,“项目”:“项目4”,“属性”:“3”}
]
};
var collection3=collection1.map((c)=>{
c、 dateStamp=collection2.邮戳;
c、 attribute=collection2.details.find((细节)=>{
返回detail.category==c.category&&detail.item==c.item;
}).属性;
返回c;
});

控制台日志(收集3)请提供显示尝试使其工作的代码。你自己也说过你“…还没有让它工作。”-请分享代码。你拥有的是JavaScript对象和数组,而不是JSON。JSON是一种文本、独立于语言的数据格式。你有JavaScript代码。谢谢,菲利克斯。我感谢你的澄清。干杯,这很有效。谢谢不过,我要用答案来标记@gaetanoM,因为它对我来说更优雅。非常感谢!事实证明,另一种解决方案“过于优雅”:。它不能按预期工作。然而,您的解决方案确实如此!节日快乐。很好的解决方案。非常感谢。我觉得它很优雅。干杯事实上进一步测试后,这不起作用。它似乎正在返回类别中的项目计数。预期结果是匹配类别和项目并返回属性。最初的测试成功了,因为“匹配”是最后一项。当“匹配”不是最后一项时,返回的属性不正确。这太好了——谢谢!我喜欢这个地图,所以我不需要迭代。使用filter()而不是find()怎么样?有什么优点或缺点吗?明天我将根据您的示例重构我的解决方案。再次感谢!明亮的测试完美,非常容易找到