首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多(3)个数组创建两个新数组

从多(3)个数组创建两个新数组
EN

Stack Overflow用户
提问于 2020-08-09 17:21:24
回答 1查看 53关注 0票数 0

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

代码语言:javascript
复制
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
代码语言:javascript
复制
groups = [["TestGrp", "1"],["TestGrp2", "2"]];
//[Group Name, Group ID]
代码语言:javascript
复制
lines = [["valueX, valueZ","valueY, valueD"],["OBJ(1)","OBJ(2),OBJ(3)"], ["GRP(1)","GRP(2)"]];

最后,我想创建两个新的数组。

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

代码语言:javascript
复制
lines[1][0] = obj[0][2]

与OBJ非常相似,需要在groups[]中查找GRP(1),然后在obj[]中查找相应的组ID,然后用在组中找到的OBJ的值替换GRP(1)。所以我们的目标是得到2个数组,就像这样:

代码语言:javascript
复制
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)]]

实现这样的目标最简单的方法是什么?我已经尝试了很多循环,但这只会让事情变得非常复杂。

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-09 21:07:28

如果不使用循环或映射/归约器,则无法获得结果。我用普通的javascript实现了下面的解决方案,如果你正在使用任何外部库,比如客户端的jquery或服务器端的lodash,那么你可以试着用它们来简化代码。

解释整个代码将非常困难,这就是为什么我在执行每个操作后都以注释的形式添加了示例值。它们将帮助您理解代码。

此外,我还没有使用人们在编写代码时应该遵循的最佳实践,比如不太具描述性的变量名称等。我尝试了更多的方法来获得结果。所以,我希望一旦你验证了它的工作,你就会公正地对待这段代码。

代码语言:javascript
复制
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);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63324613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档