我的应用程序中的一个模块从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个字符作为示例。我也不希望他们在中间分开。所以例如&#39; word&#39; +&#39;#t;是我可以连接在一起的最大值。如果我尝试添加&#39;拼字游戏&#39;对它来说,总长度将超过10个字符。所以我想发送“e t&#39;到控制台然后启动变量entry
。我也不想发送&#39;字&#39;然后&#39; e&#39;然后&#39; t&#39;然后&#39;拼字游戏&#39;就像我之前说过的,我现有的代码可行。我只想尝试清楚我的意图。
前进......下面是我的第二次代码迭代。我试图从命令式陈述转变为陈述式。所以我替换了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
块。当然有一种方法可以在我的声明性声明中添加另一个链来处理该部分吗?如果我没有角色限制,我可能会看到一种方法。
无论如何,如果我的任何描述或意图都不清楚,请告诉我,我会尽力澄清。
谢谢!
答案 0 :(得分:2)
尝试像这样使用.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'));
&#13;
答案 1 :(得分:1)
因为在for
块中您必须迭代并更改外部变量而不更改数组本身中的任何内容,您可以使用Conditional (tenary) Operator并替换for with 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)
&#13;