如何在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
};
});
LodashkeyBy
参考:
Javascript数组.map()
参考:
如果希望避免使用lodash
,可以按如下方式创建userIdToUserMap
:
const userIdToUserMap = user.reduce((acc, cur) => {
acc[cur.id] = cur;
return acc;
}, {});
Javascript数组
.reduce()
参考:user.map(aUser=>…返回一个对象,其中包含来自用户的名称和来自数据的找到的花…
侧注,这些不是表。它们是对象数组。我不理解输入和输出之间的模式。你能解释一下吗?@luekbaja两个数组的id
上的元素匹配,结果元素的名称来自第一个对象,花来自另一个。是的。这个要干净得多。