如何在javascript中从具有相同id但不同列名的不同表中获取数据

如何在javascript中从具有相同id但不同列名的不同表中获取数据,javascript,Javascript,我有两个对象数组: var user = [ {id: 1, name: 'David'}, {id: 2, name: 'John'}, {id: 3, name: 'Matt'}, ] var data = [ {id: 1, userId: 1, flower: 'Clover'}, {id: 2, userId: 1, flower: 'Sakura'}, {id: 3, userId: 2, flower: 'Rose'}, {id: 4, userId:

我有两个对象数组:

var user = [
  {id: 1, name: 'David'},
  {id: 2, name: 'John'},
  {id: 3, name: 'Matt'},
]

var data = [
  {id: 1, userId: 1, flower: 'Clover'},
  {id: 2, userId: 1, flower: 'Sakura'},
  {id: 3, userId: 2, flower: 'Rose'},
  {id: 4, userId: 3, flower: 'Sunflower'},
]
以及输出:

var result = [
      {name: 'David', flower: 'Clover'},
      {name: 'David', flower: 'Sakura'},
      {name: 'Matt', flower: 'Sunflower'},
    ]
我仍然不知道如何连接两个id列名称不同的表。有人知道在javascript中最简单的方法吗?感谢您的光临

var用户=[
var user = [
    {id: 1, name: 'David'},
    {id: 2, name: 'John'},
    {id: 3, name: 'Matt'}
];
var data = [
    {id: 1, userId: 1, flower: 'Clover'},
    {id: 2, userId: 1, flower: 'Sakura'},
    {id: 3, userId: 2, flower: 'Rose'},
    {id: 4, userId: 3, flower: 'Sunflower'}
];
var results = [];
for (var x = 0; x < user.length; x++) {
    for (var y = 0; y < data.length; y++) {
        if (data[y].userId == user[x].id) {
            var tmp = { name: user[x].name, flower: data[y].flower }
            results.push(tmp);
        }
    }
}
console.log(results);
{id:1,名字:'David'}, {id:2,名字:'John'}, {id:3,名称:'Matt'} ]; 风险值数据=[ {id:1,userId:1,flower:'Clover'}, {id:2,userId:1,flower:'Sakura'}, {id:3,userId:2,flower:'Rose'}, {id:4,userId:3,flower:'Sunflower'} ]; var结果=[]; 对于(var x=0;x
这可能可以使用过滤器和映射来完成,但我只能想到这个for循环

//Making an index of all users
var userIndex={};  user.forEach (el=>{ if (el && el.id)  userIndex[el.id] = el });
//Fill the result with each data entry
var result = [];  data.forEach (el=>{ if(el && el.userId && userIndex[el.userId])  result.push({ name:userIndex[el.userId].name, flower:el.flower }) });
//Check for results
result.forEach(el=>console.log(el));

这里针对损坏的数据和异常实施了一些额外的验证:如果用户元素没有
id
?或者,如果数据项没有
用户ID
?这就是为什么不这么“干净”的原因。

按照其他建议,有多种方法可以做到这一点。这是另一个

编辑:对你的问题有点困惑,但根据我的理解,应该是


var result = data.map(dataObj=>{
    return {
        name:user.find(userObj=>{
            return userObj.id === dataObj.userId
        }).name,
        flower:dataObj.flower
    }
})
console.log(result)
你可能想澄清原因

{ name:'John', flower:'Rose'}
不包括在内

但我的代码将包含这一点。喜欢下面的结果吗

console.log(result)

[
  { name: 'David', flower: 'Clover' },
  { name: 'David', flower: 'Sakura' },
  { name: 'John', flower: 'Rose' },
  { name: 'Matt', flower: 'Sunflower' }
]

只要您不太关心性能,我建议您使用lodash并创建一个用户id到用户记录的映射,以提高可读性

const { keyBy } = require('lodash');

const user = [
  {id: 1, name: 'David'},
  {id: 2, name: 'John'},
  {id: 3, name: 'Matt'},
];

const data = [
  {id: 1, userId: 1, flower: 'Clover'},
  {id: 2, userId: 1, flower: 'Sakura'},
  {id: 3, userId: 2, flower: 'Rose'},
  {id: 4, userId: 3, flower: 'Sunflower'},
];

const userIdToUserMap = keyBy(user, 'id');

const result = data.map(dataItem => {
  return {
    name: userIdToUserMap[dataItem.userId].name,
    flower: dataItem.flower        
  };
});
Lodash
keyBy
参考:

Javascript数组
.map()
参考:

如果希望避免使用
lodash
,可以按如下方式创建
userIdToUserMap

const userIdToUserMap = user.reduce((acc, cur) => {
  acc[cur.id] = cur;
  return acc;
}, {});

Javascript数组
.reduce()
参考:

user.map(aUser=>…返回一个对象,其中包含来自用户的名称和来自数据的找到的花…
侧注,这些不是表。它们是对象数组。我不理解输入和输出之间的模式。你能解释一下吗?@luekbaja两个数组的
id
上的元素匹配,结果元素的名称来自第一个对象,花来自另一个。是的。这个要干净得多。