javascript - JavaScript:如何映射两个对象以获得将第一个对象的 ID 映射到另一个对象的名称的输出?
问题描述
我正在尝试创建一个将 data2 对象值映射到 data1 名称的函数。
我试图用 data1 迭代 data2 object2 但它不能正常工作。我能够映射它们,但当 data2 中不存在 data1 时,我无法获取它的值。
有什么方法可以正确映射以获得代码中提到的所需输出?
let data1 = {
attributes: [{
Id: 'test1',
Name: 'Test1',
Type: 'date'
},
{
Id: 'test2',
Name: 'Test2',
Type: 'string'
},
{
Id: 'test3',
Name: 'Test3',
Type: 'string'
},
{
Id: 'test4',
Name: 'Test4',
Type: 'boolean'
}
]
};
let data2 = {
value: [{
test1: '10-12-2021',
test2: '4',
dummy: 'ignore me'
},
{
test3: '3',
test4: true,
abc: 'ignore me'
},
{
test1: '12-12-2023',
test3: '42',
dummy1: 'ignore me'
}
]
};
//output
let ouput = {
rows: [{
Test1: '10/12/2021',
Test2: '4',
Test3: '',
Test4: ''
},
{
Test1: '',
Test2: '',
Test3: '3',
Test4: 'Y'
},
{
Test1: '12/12/2023',
Test2: '',
Test3: '42',
Test4: ''
}
]
};
//function
function mapper(data1, data2) {
let formattedValue = [];
data2.value.forEach(val => {
let data = {};
for (let prop in val) {
let name;
const filter = data1.attributes.filter(el => el.Id === prop)[0];
if (filter) {
name = filter.Name;
switch (filter.Type) {
case 'boolean':
data[name] =
val[prop] === true ? 'Y' : val[prop] === false ? 'N' : '';
break;
case 'date':
data[name] = new Date(val[prop]).toLocaleDateString();
break;
default:
data[name] = val[prop];
break;
}
}
}
formattedValue.push(data);
});
return formattedValue;
}
console.log(mapper(data1, data2));
同样,如果我将 data2 作为空值传递,我希望得到低于输出
let data1 = {
attributes: [
{
Id: 'test1',
Name: 'Test1',
Type: 'string'
},
{
Id: 'test2',
Name: 'Test2',
Type: 'string'
},
{
Id: 'test3',
Name: 'Test3',
Type: 'string'
},
{
Id: 'test4',
Name: 'Test4',
Type: 'boolean'
}
]
};
let data2 = {
value: [
]
};
//output
let ouput = {
rows: [
{
Test1: '',
Test2: '',
Test3: '',
Test4: ''
},
]
};
解决方案
const data1 = {attributes:[{Id:'test1',Name:'Test1',Type:'date'},{Id:'test2',Name:'Test2',Type:'string'},{Id:'test3',Name:'Test3',Type:'string'},{Id:'test4',Name:'Test4',Type:'boolean'}]}
data2 = {value:[{test1:'10-12-2021',test2:'4'},{test3:'3',test4:true},{test1:'12-12-2023',test3:'42'}]};
data3 = {value: []}
const mapper = (x, y) => {
const row = x.attributes.map(e => [e.Id, e.Name])
format = e => { switch (true) {
case typeof e === 'boolean':
return e ? 'Y' : 'N'
case isNaN(e) && !isNaN(Date.parse(e)):
return new Date(e).toLocaleDateString()
default: return e
}}
const rows = (y.value.length ? y.value : [1]).map(e =>
Object.fromEntries(row.map(([k, v]) => [v, format(e[k]) ?? '']))
)
return { rows }
}
console.log(mapper(data1, data2))
console.log(mapper(data1, data3))
.as-console-wrapper { max-height: 100% !important; top: 0; }
解释:
y.value.length ? y.value : [1]
检查是否data.value
为空,如果不返回data.value
。如果是返回array
1 个元素(可以是任何值,只需进行 1 次迭代即可满足您对空数据的要求,因此值在这里并不重要。
其余代码应该很清楚,如果没有,请告诉我。
推荐阅读
- react-native - 功能componentDidMount没有在本机反应中触发
- javascript - 三.js根据坐标定位对象
- python-3.x - 使用来自 datareader 的股票数据时,Pandas 错误“没有要绘制的数字数据”
- php - 第三方调用的 RESTful 端点
- css - 包括对带有 typescript 的样式化组件主题的媒体查询
- r - 如何在R中的字符串集之间找到模式?
- node.js - AWS 转录:如何提供输出文件夹的路径
- django - 如何使用基于类的视图在 Django 中的一个模型的不同模板上显示不同的结果?
- react-native - 在 React Native 上使用 Apple Pay?
- mysql - SQL 查询:遍历具有相同值的行并计算出现次数