【问题标题】:How can I add elements from an array to an empty object in JavaScript?如何将数组中的元素添加到 JavaScript 中的空对象?
【发布时间】:2022-09-27 09:11:14
【问题描述】:

我有一个包含两个句子的文本文件,一个在第 1 行,另一个在第 2 行
例子:
第 1 行: foo 是黑色的
第 2 行:酒吧吠叫

第 1 行和第 2 行的内容将被放入一个数组中 例如:[\'The foo is black\', \'The bar barks\']

现在我将这两个放在一个数组中,我想遍历数组并将每个单词放在对象内部的句子中以及它所在的行号。 例子:

{
    barks : 2 //line 2
    black : 1 //line 1
    foo: 1
    bar: 2
    is : 1
    the : 1, 2
}

我该如何处理?我认为我可以遍历数组,然后将每个单词添加到一个对象中,但输出不一定必须在一个对象中,这只是我的想法。重要的是要注意输出也必须按字母顺序排序。

  • 对象不按任何顺序排序。您可能想改用Map
  • 谢谢你。我仍然不确定我将如何处理这个问题。
  • @迈克尔M。 Objects have guaranteed order 但它不是通过插入。

标签: javascript arrays algorithm object data-structures


【解决方案1】:

我认为最好的方法是坚持使用一个数组,您实际上可以对其进行排序(Map 如果并且当您在多行上使用相同的单词时会很困难)。

看这个过程:

const data = ['The foo is black', 'The bar barks'];

let output = new Array();

data.forEach((i, line) => {
  line++; // because line numbers start from 1
  // split into words lowercase and include line number
  const words = i.split(' ').map(j => j.toLowerCase()).map(text => ({
    text,
    line
  }));
  output.push(...words);
});

// sort alphabetically
output = output.sort((a, b) => (+(a.text > b.text) || -1));

console.log('Data sorted alphabetically with line numbers:', output);

【讨论】:

  • 我认为这对我来说最有意义。谢谢你。
【解决方案2】:

由于顺序很重要,最终结果最好是成对数组。而且由于一个词可能在相同的字符串,不仅要提及行号,还要提及该行中单词的编号,这可能会很有趣:

function wordOccurrences(lines) {
    const obj = {};
    lines.forEach((lineStr, line) =>
        lineStr.toLowerCase().match(/\S+/g).forEach((wordStr, word) =>
            (obj[wordStr] ??= []).push({line, word})
        )
    );
    const result = Object.entries(obj).sort(([a], [b]) => a.localeCompare(b));
    return result;
}

const result = wordOccurrences(['The foo is black', 'The bar barks']);
console.log(result);

【讨论】:

    【解决方案3】:

    使用Map,您可以这样做:

    const lines = ['The foo is black', 'The bar barks'];
    
    let wordCount = new Map();
    for (let i = 0; i < lines.length; i++) {
        const words = lines[i].split(' ');
        for (const word of words) {
            let count = wordCount.get(word.toLowerCase()) || [];
            count.push(i + 1);
            wordCount.set(word.toLowerCase(), count);
        }
    }
    
    wordCount = new Map([...wordCount.entries()].sort());
    console.log(wordCount);
    

    我相信这是最容易理解和最惯用的方法。

    【讨论】:

    • 这似乎给出了一个空对象?
    • 奇怪的是,在我的机器上,它给出了一个排序的地图。一次秒。
    • 啊,对不起:您发布的演示提供了一个空对象,但开发控制台提供了所需的结果。
    • 我在 Chrome 和 node.js 中对此进行了测试。它似乎有效,但不适用于 SO sn-ps
    【解决方案4】:

    我知道,已经有一个公认的答案。然而,这是我的看法。 sn-p 生成一个对象obj,其中各个单词是键。它们按字母顺序排列。关联的值是包含关键字(单词)出现的行号的数组:

    const str=`The foo is black
    The bar barks
    And the last one is stupid`;
    
    obj=Object.fromEntries(
     Object.entries(
      str.toLowerCase().split("\n").reduce((a,line,i)=>{
       line.split(/\s+/).forEach(w=>(a[w]??=[]).push(i));
       return a;
      },{})
     ).sort(([a],[b])=>a.localeCompare(b))
    );
    console.log(obj);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2015-05-14
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多