如何使用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()怎么样?有什么优点或缺点吗?明天我将根据您的示例重构我的解决方案。再次感谢!明亮的测试完美,非常容易找到