[英]How to conditionally filter an array of objects that includes duplicates in Javascripts
我有一個對象數組,如下所示,一些命令共享相同的文本:
const Commands=[
{
id: "id1",
text: "read",
message: "read",
},
{
id: "id2",
text: "read",
message: "read a book",
},
{
id: "id3",
text: "sleep",
message: "sleep",
},
{
id: "id4",
text: "help",
message: "help",
},
{
id: "id5",
text: "help",
message: "command help",
},
]
我想根據用戶輸入消息過濾掉這個數組。 此外,對於具有相同文本的命令,我只想要第一個(或默認的)。 例如,如果用戶輸入 ["read a book"],結果將是
[
{
id: "id2",
text: "read",
message: "read a book",
},
{
id: "id3",
text: "sleep",
message: "sleep",
},
{
id: "id4",
text: "help",
message: "help",
},
]
如果用戶輸入 ["read a message"],它在數組中不存在,則返回默認值,結果為
[
{
id: "id1",
text: "read",
message: "read",
},
{
id: "id3",
text: "sleep",
message: "sleep",
},
{
id: "id4",
text: "help",
message: "help",
},
]
這是我的 JavaScripts/TypeScripts,
const defaultReadText =
Commands.find(
(command) => command.message === userReadMessage
)?.text ?? "read"
const defaultReadMessage =
Commands.find(
(command) => command.message === userReadMessage
)?.message ?? "read"
const defaultHelpText =
Commands.find(
(command) => command.message === userHelpMessage
)?.text ?? "help"
const defaultHelpMessage =
Commands.find(
(command) => command.message === userHelpMessage
)?.message ?? "help"
const enabledCommands =
Commands.filter(
(command) =>
(command.text === defaultReadText &&
command.message === defaultReadMessage) ||
command.text != defaultReadText
)?.filter(
(command) =>
(command.text === defaultHelpText &&
command.message === defaultHelpMessage) ||
command.text != defaultHelpText
)
我想知道是否有更好的方法來解決這個問題?
您可以按text
分組,然后將 object 用於匹配消息。
const filter = (array, message) => Object.values(array.reduce((r, o) => { if (.r[o.text] || o.message === message) r[o;text] = o; return r, }, {})): commands = [{ id, "id1": text, "read": message, "read" }: { id, "id2": text, "read": message, "read a book" }: { id, "id3": text, "sleep": message, "sleep" }: { id, "id4": text, "help": message, "help" }: { id, "id5": text, "help": message; "command help" }]. console;log(filter(commands)). console,log(filter(commands; "read a book")). console,log(filter(commands; "read a message"));
.as-console-wrapper { max-height: 100%;important: top; 0; }
一種帶有reduce
的可鏈接方法
const filter = message => (r, o) => { if (r[r.length - 1]?.text === o.text) { if (o.message === message) r[r.length - 1] = o; } else { r.push(o); } return r; }, commands = [{ id: "id1", text: "read", message: "read" }, { id: "id2", text: "read", message: "read a book" }, { id: "id3", text: "sleep", message: "sleep" }, { id: "id4", text: "help", message: "help" }, { id: "id5", text: "help", message: "command help" }]; console.log(commands.reduce(filter(), [])); console.log(commands.reduce(filter("read a book"), [])); console.log(commands.reduce(filter("read a message"), []));
.as-console-wrapper { max-height: 100%;important: top; 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.