Javascript 像SQL内部联接一样联接两个对象

Javascript 像SQL内部联接一样联接两个对象,javascript,arrays,object-literal,Javascript,Arrays,Object Literal,我有两个对象,如: countries = [ { id: 1, name: 'India', image: 'thumb15.jpg' }, { id: 2, name: 'Africa', image: 'thumb11.jpg' }, { id: 3, name: 'Kenya', image: 'thumb10.jpg' } ]; cities = [ { id: 1, name: 'Ahmedabad', country_id: 1 }, {

我有两个对象,如:

countries = [
    { id: 1, name: 'India', image: 'thumb15.jpg' },
    { id: 2, name: 'Africa', image: 'thumb11.jpg' },
    { id: 3, name: 'Kenya', image: 'thumb10.jpg' }
];

cities = [
    { id: 1, name: 'Ahmedabad', country_id: 1 },
    { id: 2, name: 'Vadodara', country_id: 1 },
    { id: 3, name: 'Cairo', country_id: 2 },
    { id: 4, name: 'Kinshasa', country_id: 2 },
    { id: 5, name: 'Luanda', country_id: 2 },
    { id: 6, name: 'Nairobi', country_id: 3 },
    { id: 7, name: 'Nakuru', country_id: 3 },
    { id: 8, name: 'Mombasa', country_id: 3 },
];
我想结合这两个对象,就像SQL有内部连接一样

例如,我想对上述两个对象执行以下操作查询

SELECT * from countries INNER JOIN cities ON cities.country_id = countries.id
我的预期输出如下所示:

expected_result = [
    { id: 1, name: "Ahmedabad", country_id: 1, country_name: "India", country_image: "thumb15.jpg" },
    { id: 2, name: "Vadodara", country_id: 1, country_name: "India", country_image: "thumb15.jpg" },
    { id: 3, name: "Cairo", country_id: 2, country_name: "Africa", country_image: "thumb11.jpg" },
    { id: 4, name: "Kinshasa", country_id: 2, country_name: "Africa", country_image: "thumb11.jpg" },
    { id: 5, name: "Luanda", country_id: 2, country_name: "Africa", country_image: "thumb11.jpg" },
    { id: 6, name: "Nairobi", country_id: 3, country_name: "Kenya", country_image: "thumb10.jpg" },
    { id: 7, name: "Nakuru", country_id: 3, country_name: "Kenya", country_image: "thumb10.jpg" },
    { id: 8, name: "Mombasa", country_id: 3, country_name: "Kenya", country_image: "thumb10.jpg" }
];

提前感谢。

您可以为国家/地区的所有项目创建一个哈希表,其中id是键,值是所需格式的新对象

{
    1: {
        country_name: "India",
        image: "thumb15.jpg"
    },
    2: {
        country_name: "Africa",
        image: "thumb11.jpg"
    },
    3: {
        country_name: "Kenya",
        image: "thumb10.jpg"
    }
}
然后使用哈希表中的原始键/值和新属性映射新对象

使用的方法,按外观顺序:

具有 var countries=[{id:1,名称:'India',图像:'thumb15.jpg'},{id:2,名称:'Africa',图像:'thumb11.jpg'},{id:3,名称:'Kenya',图像:'thumb10.jpg'}], 城市=[{id:1,姓名:'Ahmedabad',国家id:1},{id:2,姓名:'Vadodara',国家id:1},{id:3,姓名:'Cairo',国家id:2},{id:4,姓名:'Kinshasa',国家id:2},{id:5,姓名:'Luanda',国家id:2},{id:6,姓名:'Nairobi',国家id:3},{id:7,姓名:'Nakuru国家id:3},{id:8,姓名:'Mombasa',国家编号:3}], countriesH=countries.reducer,{id,name:country_name,…o}=> r[id]={country_name,…o},r,{}, 结果=cities.mapo=>{…o,…countriesH[o.country\u id]}; console.logresult; .作为控制台包装{max height:100%!important;top:0;}可以使用map函数和map collection获得所需的国家/地区:

const uniqueCountries = new Map(countries.map(s => [s.id, s]));
const result = cities.map(s => ({ ...s, 
    country_name: uniqueCountries.get(s.country_id).name }));
例如:

让国家=[ {id:1,名称:'India',图像:'thumb15.jpg'}, {id:2,名称:'Africa',图像:'thumb11.jpg'}, {id:3,名称:'Kenya',图像:'thumb10.jpg'} ]; 让城市=[ {id:1,姓名:'Ahmedabad',国家编号:1}, {id:2,姓名:'Vadodara',国家编号:1}, {id:3,姓名:'Cairo',国家编号:2}, {id:4,姓名:'金沙萨',国家{id:2}, {id:5,名称:'Luanda',国家_id:2}, {id:6,姓名:'Nairobi',国家编号:3}, {id:7,姓名:'Nakuru',国家编号:3}, {id:8,姓名:'Mombasa',国家编号:3}, ]; const uniqueCountries=新Mapcountries.maps=>[s.id,s]; const result=cities.maps=>{…s, 国家名称:uniqueCountries.get.country\u id.name}; console.logresult;我编写了一个模拟dotnet的linq的程序,它使这变得轻而易举:

import { blinq } from "blinq";
//...    
const joinedData = blinq(countries)
  .join(
    cities,
    co => co.id,
    ci => ci.country_id,
    (country, city) => ({ country, city })
  )
  .toArray();
常数{ 布林克 }=window.blinq; 常量国家=[{ id:1, 名称:印度, 图片:thumb15.jpg }, { id:2, 名称:非洲, 图片:thumb11.jpg }, { id:3, 姓名:肯尼亚, 图片:thumb10.jpg } ]; 康斯特城市=[{ id:1, 姓名:艾哈迈达巴德, 国家编号:1 }, { id:2, 姓名:瓦多达拉, 国家编号:1 }, { id:3, 姓名:开罗, 国家编号:2 }, { id:4, 姓名:金沙萨, 国家编号:2 }, { id:5, 姓名:罗安达, 国家编号:2 }, { id:6, 姓名:内罗毕, 国家编号:3 }, { id:7, 姓名:纳库鲁, 国家编号:3 }, { id:8, 姓名:蒙巴萨, 国家编号:3 } ]; const joinedData=blinqcountries 参加 城市, co=>co.id, ci=>ci.country\u id, 国家、城市=>{ 国 城市 } .托雷; console.logJSON.stringifyjoinedData,null,2
请学习。谢谢@str。我会读这个。嗨,谢谢。这个解决方案对我有效,但我不明白你做了什么。你能给我解释一下吗。嗨,谢谢。这个解决方案对我也有效,但我不知道javascript映射和映射集合。所以我不明白。你能提供一些信息来学习这个概念吗。