簡體   English   中英

如何將數組中的元素添加到 JavaScript 中的空 object?

[英]How can I add elements from an array to an empty object in JavaScript?

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

第 1 行和第 2 行的內容將被放入一個數組示例中: ['The foo is black', 'The bar barks']

現在我將這兩個放在一個數組中,我想遍歷數組並將每個單詞放在 object 內的句子中,以及它所在的行號。 例子:

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

我該如何處理? 我認為我可以遍歷數組,然后將每個單詞添加到 object 但 output 不一定必須在 object 中,這只是我的想法。 需要注意的是,output 也必須按字母順序排序。

我認為最好的方法是堅持使用一個數組,您實際上可以對其進行排序(如果並且當您在多行上使用相同的單詞時, 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);

由於順序很重要,最終結果最好是成對數組。 由於一個單詞可能在同一個字符串中出現多次,因此不僅要提及行號,還要提及該行中單詞的編號可能會很有趣:

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

使用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);

我相信這是最容易理解和最慣用的方法。

我知道,已經有一個公認的答案。 然而,這是我的看法。 它將適用於尊重對象中鍵的插入順序的“現代”瀏覽器。 該片段生成一個 object obj ,其中各個單詞是鍵。 它們按字母順序排列。 相關的值為 arrays 包含出現關鍵字(單詞)的行號:

 const str=`The foo is black The bar barks And the last 1 is stupid and has 12 words in it`; obj=Object.fromEntries( Object.entries( str.toLowerCase().split("\n").reduce((a,line,i)=>{ line.split(/\s+/).forEach(w=>(a[w]??={})[i+1]=1); return a; },{}) ).sort(([a],[b])=>a.localeCompare(b)).map(([k,v])=>[k,Object.keys(v).map(k=>+k)]) ); console.log(obj);

表達式.sort(([a],[b])=>a.localeCompare(b)).map(([k,v])=>[k,Object.keys(v).map(k=>+k)])是操作的核心。 它對整個 object 的鍵進行排序,並將它們的值(最初也是具有字符串類型鍵的對象)轉換回數字的 arrays。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM