我正在尝试从我拥有的3个数组中处理一些数据。
obj = [["TestObj","1","value1","1"],["TestObj2","2","value2","1"],["TestObj3","3","value3",["1","2"]]];
//[Name, ID, value, Group ID(s)] //TestObj3 belongs to both groupsgroups = [["TestGrp", "1"],["TestGrp2", "2"]];
//[Group Name, Group ID]lines = [["valueX, valueZ","valueY, valueD"],["OBJ(1)","OBJ(2),OBJ(3)"], ["GRP(1)","GRP(2)"]];最后,我想创建两个新的数组。
查看lines[],我想查看每个OBJ条目,并将其替换为来自obj[]的相应值。例如,查看OBJ(1),1是OBJ的ID,它基本上对应于TestObj:
lines[1][0] = obj[0][2]与OBJ非常相似,需要在groups[]中查找GRP(1),然后在obj[]中查找相应的组ID,然后用在组中找到的OBJ的值替换GRP(1)。所以我们的目标是得到2个数组,就像这样:
lines = [["valueX, valueZ","valueY, valueD"],["value1","value2, value3"], ["value1, value2, value3","value3"]];
newObj = [["OBJ(1)", "value1", 1, "TestGrp"], ["OBJ(2)", "value2", 1, "TestGrp"], ["OBJ(3)", "value3", [1, 2], [TestGrp, TestGrp2]]];
//[[Name, value, Group ID(s), Group Name(s)]]实现这样的目标最简单的方法是什么?我已经尝试了很多循环,但这只会让事情变得非常复杂。
干杯
发布于 2020-08-09 21:07:28
如果不使用循环或映射/归约器,则无法获得结果。我用普通的javascript实现了下面的解决方案,如果你正在使用任何外部库,比如客户端的jquery或服务器端的lodash,那么你可以试着用它们来简化代码。
解释整个代码将非常困难,这就是为什么我在执行每个操作后都以注释的形式添加了示例值。它们将帮助您理解代码。
此外,我还没有使用人们在编写代码时应该遵循的最佳实践,比如不太具描述性的变量名称等。我尝试了更多的方法来获得结果。所以,我希望一旦你验证了它的工作,你就会公正地对待这段代码。
let obj = [
["TestObj","1","value1","1"],
["TestObj2","2","value2","1"],
["TestObj3","3","value3", ["1","2"]]
];
let groups = [
["TestGrp", "1"],
["TestGrp2", "2"]
];
let lines = [
["valueX, valueZ","valueY, valueD"],
["OBJ(1)","OBJ(2),OBJ(3)"],
["GRP(1)","GRP(2)"]
];
const getId = (el => el.trim().replace(/[^0-9]/g, ''));
const getGroupName = (grpId => groups.find(grp => (grp[1] === grpId))[0]);
let newLines = [[...lines[0]]];
newLines[1] = lines[1].map(line => { // line = 'OBJ(2),OBJ(3)'
let lineArr = line.split(','); // lineArr = [ 'OBJ(2)', 'OBJ(3)' ]
let value;
let valuesArr = lineArr.map(el => {
let idToSearch = getId(el) // idToSearch = '2'
obj.some(objEl => { // objEl = ['TestObj2','2','value2','1']
if(objEl[1] === idToSearch) {
value = objEl[2];
return true;
}
});
return value; // return 'value2'
});
return valuesArr.join(', ');
});
newLines[2] = lines[2].map(line => { // line = 'GRP(1)'
let grpId = getId(line) // grpId = '1'
let valuesArr = obj.map(objEl => {
if(Array.isArray(objEl[3])) { // objEl[3] = ['TestObj3','3','value3', ['1','2']]
let value;
// Assuming single occurence of ids in objEl[3]
objEl[3].some(objElGrpId => {
if(grpId === objElGrpId) {
value = objEl[2];
return true;
}
});
return value; // return 'value3'
} else {
if(grpId === objEl[3]) {
return objEl[2];
}
}
});
return valuesArr.filter(Boolean).join(', ');
});
let newObj = [];
lines[1].forEach(line => { // line = 'OBJ(2),OBJ(3)'
let lineArr = line.split(','); // lineArr = [ 'OBJ(2)', 'OBJ(3)' ]
let finalArr = lineArr.map(el => {
let currentIdArr = [];
currentIdArr.push(el); // finalArr = [ 'OBJ(2)' ]
let idToSearch = getId(el) // idToSearch = '2'
obj.some(objEl => {
if(objEl[1] === idToSearch) {
currentIdArr.push(objEl[2]); // finalArr = [ 'OBJ(2)', 'value2' ]
if(Array.isArray(objEl[3])) {
currentIdArr.push(objEl[3].map(grpId => parseInt(grpId)));
currentIdArr.push(objEl[3].map(grpId => getGroupName(grpId)));
} else {
currentIdArr.push(parseInt(objEl[3])); // finalArr = [ 'OBJ(2)', 'value2', 1 ]
currentIdArr.push(getGroupName(objEl[3])); // finalArr = [ 'OBJ(2)', 'value2', 1, 'TestGrp2' ]
}
return true;
}
});
return currentIdArr;
});
finalArr.map(arr => newObj.push(arr));
});
console.log('newLines', newLines);
console.log('newObj', newObj);
https://stackoverflow.com/questions/63324613
复制相似问题