繁体   English   中英

从多个 (3) arrays 创建几个新的 arrays

[英]Create a couple of new arrays from multiple (3) arrays

我正在尝试处理我拥有的 3 个 arrays 中的一些数据。

obj = [["TestObj","1","value1","1"],["TestObj2","2","value2","1"],["TestObj3","3","value3",["1","2"]]];
//[Name, ID, value, Group ID(s)] //TestObj3 belongs to both groups
groups = [["TestGrp", "1"],["TestGrp2", "2"]];
//[Group Name, Group ID]
lines = [["valueX, valueZ","valueY, valueD"],["OBJ(1)","OBJ(2),OBJ(3)"], ["GRP(1)","GRP(2)"]];

现在最终,我想创建两个新的 arrays。

查看行[],我想查看每个 OBJ 条目并将其替换为来自 obj[] 的相应值。 例如查看 OBJ(1),1 是 OBJ 的 ID,它基本上对应于 TestObj:

lines[1][0] = obj[0][2]

与 OBJ 非常相似,需要在 groups[] 中查找 GRP(1),然后在 obj[] 中查找对应的 Group ID,然后将 GRP(1) 替换为在 group 中找到的 OBJ 的值。 所以目标是最终得到 2 个 arrays,如下所示:

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)]]

实现这样的事情的最简单方法是什么? 我一直在尝试很多循环,但它只会让事情变得破碎并且非常复杂。

干杯

如果不使用循环或映射/缩减器,您将无法获得结果。 我在 vanilla javascript 中实现了以下解决方案,如果您使用任何外部库,例如客户端的lodash或服务器端的 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM