簡體   English   中英

從命令式到聲明式字符限制

[英]Moving Imperative to Declarative- character limitations

我的應用程序中的一個模塊從mongodb中提取記錄,並打印出字段供用戶查看。 字段以特定順序顯示。 訂單存儲在數組中。 mongodb文檔( pers )可能沒有填寫所有可能的字段。 無論如何,這是我原始代碼的示例。 有用。 我想繼續前進。 我會解釋。

const keys = ['banana', 'orange', 'apple', 'grape']

const pers = {
    banana: 'word',
    orange: 'e t',
    apple: 'scrabble',
}
let entries = []
let entry = ''

keys.forEach(key => {
    if (pers[key]) entries.push(pers[key])
})

for (let i=0; i<entries.length; i++) {
    if ((entries.length + entries[i].length < 10) entry += '\n' + entries[i]
    else {
        console.log(entry) //message.send in my app
        entry = entries[i]
    }
}
console.log(entry)

因此,在我的應用程序中,發送的消息不能超過2000個字符。 我在帖子中使用10個字符作為示例。 而且我也不希望他們在中間分裂。 因此,例如“ word” +“ et”是我可以連接在一起的最大值。 如果我嘗試在其中添加“拼字游戲”,則總長度將超過10個字符。 所以我想“字等”發送到控制台,然后啟動變量entry了過來。 我也不想發送“單詞”,然后發送“ e”,然后發送“ t”,然后發送“拼字游戲”。 就像我之前說過的,我現有的代碼有效。 我只想嘗試並明確我的意圖。

前進...下面是我的第二次代碼迭代。 我正在嘗試從命令式聲明轉為聲明式。 因此,我替換了forEach塊。 這也很好。

const keys = ['banana', 'orange', 'apple', 'grape']

const pers = {
    banana: 'word',
    orange: 'e t',
    apple: 'scrabble',
}
let entry = ''

const entries = keys.filter(key => pers.hasOwnProperty(key)).map(key => pers[key])

for (let i=0; i<entries.length; i++) {
    if ((entries.length + entries[i].length < 10) entry += '\n' + entries[i]
    else {
        console.log(entry)
        entry = entries[i]
    }
}
console.log(entry)

這兩個的控制台輸出是:

word
e t
scrabble

那正是我想要的。 現在我真的想從搬走for ,如果可能的塊。 當然,有一種方法可以在我的聲明性語句中添加另一個鏈來處理該部分? 如果沒有字符限制,我可能會找到一種解決方法。

無論如何,如果我的描述或意圖不清楚,請讓我知道,我將盡力澄清。

謝謝!!

嘗試像這樣使用.reduce 您的原始代碼有語法錯誤,因此我假設那只是一個錯字,而不是重要的東西。

盡管在功能上與您當前的代碼相同,但仍然令人費解。 如果您是我,我會在迭代時創建一個entryStrs數組,然后稍后用console.log它們全部記錄下來,如下所示:

 const keys = ['banana', 'orange', 'apple', 'grape'] const pers = { banana: 'word', orange: 'e t', apple: 'scrabble', } const { currentMessage, messages } = keys .filter(key => pers.hasOwnProperty(key)) .map(key => pers[key]) .reduce(({ currentMessage = '', messages = [] }, entry, i, entries) => { if (entries.length + entry.length < 10) { currentMessage += currentMessage ? ('\\n' + entry) : entry; } else { messages.push(currentMessage) currentMessage = entry; } return { currentMessage, messages }; }, {}); const allMessages = [...messages, currentMessage]; console.log(allMessages.join('\\n-----\\n-----\\n')); 

由於在for塊中,您必須迭代和更改外部變量,並且不更改數組本身中的任何內容,因此可以使用條件(三元)運算符用forEach()代替

 const keys = ['banana', 'orange', 'apple', 'grape'] const pers = { banana: 'word', orange: 'e t', apple: 'scrabble', } let entry = '' const entries = keys.filter(key => pers.hasOwnProperty(key)).map(key => pers[key]) entries.forEach(e => { entries.length + e.length < 10 ? entry += '\\n' + e : (console.log(entry), entry = e) }); console.log(entry) 

暫無
暫無

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

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