[英]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.