【问题标题】:Create an array of strings of every lines创建每行的字符串数组
【发布时间】:2020-12-19 21:11:05
【问题描述】:

我是 React.js 的新手(使用钩子)并且想通过简单的编码来学习, 我的问题是我想从 ksngfr.com/something.txt 获取数据,我从那里得到的数据是 '2005-07-09 03:05 1:74539 2:29735 3:95426 4:35489 ...' 它是 '.txt',我想将它们放入数组(键、值)中,并分别访问它们,我发现了这个 'loadStrings() ' 对这个特定目的有好处(主要是在旧网站上讨论)还是在 React.js(钩子)中有更好的?

我正在获取的数据:

英语不是我的母语,如有错误请见谅。

【问题讨论】:

    标签: javascript arrays reactjs string react-hooks


    【解决方案1】:

    您可以通过使用分隔符从文本创建数组,然后在数组上迭代以将键/值添加到对象来做到这一点

    const str = "1:345 2:455 3:678";
     var data = str.split(' '); //create array from text by spliting it 
     const obj = {};
    data.forEach(d=>{
    var key = d.split(':')[0]; //extract the key from each data
    var value = d.split(':')[1]; //extract the value from each data
    obj[key] = value;
    });
    console.log(obj);

    【讨论】:

    • 由于某种原因,我得到的数组看起来不同,它看起来像这样:["2005-07-09", "03:05↵1:74539↵2:29735↵3: 95426↵4:35489↵"]
    【解决方案2】:

    字符串操作

    您可以使用标准字符串操作将[key, value] 对的数组传递给Object.fromEntries(),这将返回一个对象。

    const str = "1:345 2:455 3:678";
    
    const object = Object.fromEntries(
      str.split(' ').map(d => ([k, v] = d.split(':'), [k, v])));
    
    console.log(object);

    编辑

    看起来您现在正在寻找一个完整匹配的数组,并且您的初始字符串不太规则。为了适应这一点,在不知道你的字符串细节的情况下,我认为正则表达式会更好地为你服务。如果您想使用它来创建对象,这个 sn-p 仍然会捕获 : 两侧的元素,但这里只有完整匹配是 map()ed 到最终数组。

    const str = "2005-07-09 03:05↵1:74539↵2:29735\n\r3:95426↵4:35489\n\r";
    
    const regex = /(\d+)[:|-](\d+)(?:[:|-](\d+))?(?=\D|$)/g
    const array = Array.from(str.matchAll(regex), ([m]) => m);
    
    console.log(array);

    带有 matchAll() 的正则表达式

    您还可以使用 matchAll() 和一个简单的正则表达式来返回键/值匹配的迭代器。

    这些可以传递给 Array.from() 并映射到 [key, value] 对的数组,然后可以传递给 Object.fromEntries() 以生成最终对象。

    const str = "1:345 2:455 3:678";
    
    const regex = /(\d+):(\d+)(?=\s|$)/g;
    const object = Object.fromEntries(
        Array.from(str.matchAll(regex), ([_, key, value]) => [key, value]));
        
    console.log(object);

    说明

    这里是上述一个班轮的分步实现。

    // input
    const str = "1:345 2:455 3:678";
    
    // define regular expression
    const regex = /(\d+):(\d+)(?=\s|$)/g;
    
    // return iterator from matchAll() called on input passing regex
    const matchIterator = str.matchAll(regex);
    
    // pass the iterator to Array.from() and use built in map() 
    // to return a [key, value] array using destructuring.
    const keyValueArr = Array.from(matchIterator, ([_, key, value]) => [key, value]);
    
    // pass the array to Object.fromEntries()
    const finalObject = Object.fromEntries(keyValueArr);
    

    regular expression:

    • (\d+) 任意数量的连续数字(已捕获)
    • : 后跟冒号(未捕获)
    • (\d+) 后面紧跟另一组数字(被捕获)
    • (?=\s|$) 前瞻空格或行尾
    • /g 全局标志来查找所有事件。

    matchAll() 的返回值将是形状为 ['full match', 'capture group 1', 'capture group 2'] 的数组的迭代器(例如:['1:345', '1', '345']


    【讨论】:

    • 感谢您的良好解释,但我最终使用了另一个用户的答案,它有效但数组看起来不同,我确实喜欢这样:{(daattaa = data?.split(" ")) } {console.log(daattaa)},由于某种原因,我得到的数组看起来不同,它看起来像这样:[“2005-07-09”,“03:05↵1:74539↵2:29735 ↵3:95426↵4:35489↵"] ,知道这些字符是什么吗?为什么没有逗号而不是那些字符? (如果你写anwer不要删除你以前的答案,它可能会帮助其他人因为它非常详细)
    • 这些是返回符号,表示应该有一个换行符。
    • 是的,但所有内容都应该在逗号内(现在只有一个逗号),它应该看起来像这样 ["2005-07-09", "03:05","1:74539", "2:29735","3:95426","4:35489"]
    • 您的数组只有两个元素长。第二个元素是一个带有 字符而不是空格的字符串,所以它没有得到split()。您需要在 字符split('↵') 上再次拆分它,或者更好的是data.replace(/↵/g, ' ').split(' ')
    • 你的意思是这样的:daattaa = data?.replace(/↵/g, " ").split(" ");控制台.log(daattaa);如果是这样,它不工作我得到相同的结果
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 2018-12-12
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多