【问题标题】:How can I push to an object property array based on a string match?如何根据字符串匹配推送到对象属性数组?
【发布时间】:2019-08-03 13:45:29
【问题描述】:

我正在尝试读取文件列表,并根据字符匹配将找到的值推送到对象内的指定数组中。

有一个对象具有三个属性键,每个键都有一个空数组作为值。我需要为两个特定的字符串值解析一个文件列表,每个文件都将两个值之一与对象属性键进行比较,如果匹配,则将第二个值推送到该属性值数组。

我被困在如何根据第一个值的匹配将第二个找到的值与正确的属性键连接起来。该脚本当前将所有第二个值推送到所有三个对象属性数组,而我只想将第二个值推送到与文件中找到的第一个值匹配的数组。

模块

fs
glob

目录结构

+-- _parse-test.js
+-- _scss
|   +-- component.scss
|   +-- document.scss
|   +-- utilities.scss

运行程序

node .\parse-test.js

解析测试.js

var fs = require("fs");
var glob = require("glob");

function runProgram() { 

    var navObjects = {
        'Components': [],
        'Document': [],
        'Utilities': []
    }

    const files = glob.sync("scss/*.scss", "matchBase:true");

    files.forEach(async (file) => {

        try {

            const navPairings = { 
                component: "",
                parent: ""
            };

            let componentName = "";
            let navName = "";

            const text = fs.readFileSync(file).toString().split("\n");

            for (let i = 0; i < text.length; i++) {

                if (text[i].includes("/// @group") === true ) {

                    componentName = text[i].replace("/// @group ", "");
                    componentName = componentName.replace("\r", "");
                }

                if (text[i].includes("/// @navGroup") === true ) {

                    navName = text[i].replace("/// @navGroup ", "");
                    navName = navName.replace("\r", "");

                }

                navPairings[i] = {
                    component: componentName,
                    parent: navName
                }

                const pair = navPairings[i];

                for (let navGroup of Object.keys(navObjects)) {

                    if (pair.component !== '') {
                        if (navObjects.hasOwnProperty(navGroup)) {
                            navObjects[navGroup].push(pair.component);

                        }
                    }
                }
            }     
        }
        catch(e) {
            console.log("Error", e.stack);
            console.log("Error", e.name);
            console.log("Error", e.message);
        }
    });

    console.log(navObjects);
}

runProgram();

SCSS 文件内容

组件.scss

/// @group nav
/// @navGroup Components

文档.scss

/// @group scroll
/// @navGroup Document

utilities.scss

/// @group colors
/// @navGroup Utilities

当前控制台输出

{ Components: [ 'nav', 'nav', 'scroll', 'scroll', 'colors', 'colors' ],  
Document: [ 'nav', 'nav', 'scroll', 'scroll', 'colors', 'colors' ],
Utilities: [ 'nav', 'nav', 'scroll', 'scroll', 'colors', 'colors' ] }

所需的控制台输出

{ Components: [ 'nav', ... ],  
Document: [ 'scroll', ... ],
Utilities: [ 'colors', ... ] }

如何将第二个找到的值推送到正确的数组?

【问题讨论】:

    标签: javascript arrays string sorting


    【解决方案1】:

    首先,您从Object.keys(navObjects) 获得navGroup。 然后你检查navObjects.hasOwnProperty(navGroup)

    我会说这几乎总是正确的。你不觉得吗?

    你根本不需要最后一个 for 循环。这应该足够了:

                    if (pair.component !== '') {
                        if (navObjects.hasOwnProperty(pair.parent)) {
                            navObjects[pair.parent].push(pair.component);
    
                        }
                    }
    

    【讨论】:

    • 我讨厌想太多。你最好! ++++
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多