什么';用数组列表筛选空元素的对象并按首选顺序排序是一种优雅的方法吗?(Javascript,Node.js)

什么';用数组列表筛选空元素的对象并按首选顺序排序是一种优雅的方法吗?(Javascript,Node.js),javascript,node.js,Javascript,Node.js,我有一个Dialogflow云函数,它从用户输入中获取参数对象 当我输入Dialogflow:“我在花园里工作”时,它基本上创建了这个parameters对象: var参数对象={ 名词:[“花园”], 代词限定:[“I”], 详细说明:[“am”], 条款:[“该”], 详细说明:[“正在工作”], 介词:[“in”], 详细定义:[], 副词:[], }; 现在我的计划是以某种顺序将所有必要的数据写入Firebase。 我想在此使用此数组列表筛选所有参数,这也给出了我的首选顺序: var列

我有一个Dialogflow云函数,它从用户输入中获取参数对象

当我输入Dialogflow:“我在花园里工作”时,它基本上创建了这个parameters对象:

var参数对象={
名词:[“花园”],
代词限定:[“I”],
详细说明:[“am”],
条款:[“该”],
详细说明:[“正在工作”],
介词:[“in”],
详细定义:[],
副词:[],
};
现在我的计划是以某种顺序将所有必要的数据写入Firebase。 我想在此使用此数组列表筛选所有参数,这也给出了我的首选顺序:

var列表参数=[
“代词有限”,
“verbsInfinitiv”,
“verbsGerund”,
“条款”,
“名词”,
];
然后按照my listOfParameters中的顺序创建非空对象的新列表:

var listofNonPtyObject=[];
然后,此NomptyObject列表将写入Firebase

现在,我将所有对象添加到ListOfNonPtyObject中,如下所示:

试试看{
const denosdefinite=agent.parameters.denosdefinite[0];
push({“代词有限”:代词有限});
}捕获(错误){}
试一试{
const definesdefinite1=agent.parameters.definesdefinite1[1];
push({“代词定义1”:代词定义1});
}捕获(错误){}
试一试{
const verbsInfinitiv=agent.parameters.verbsInfinitiv[0];
push({“verbsnifinitiv”:verbsnifinitiv});
}捕获(错误){}
试一试{
const verbsGerund=agent.parameters.verbsGerund[0];
push({“verbsGerund”:verbsGerund});
}捕获(错误){}
试一试{
const articles=agent.parameters.articles[0];
push({“articles”:articles});
}捕获(错误){}
试一试{
常量名词=代理.参数.名词[0];
push({“nomes”:nomes});
}捕获(错误){}
所以我得到这个:

ListofNonPtyObject=[
{代词限定:“I”},
{verbsGerund:“工作”},
{条款:“},
{名词:“花园”},
];
我还设置了“ignoreUndefinedProperties:true”,它省略了空元素(在本例中,verbsInfinitiv没有值)

是否有一种更优雅的方法,可以使用forEach函数查找listOfParameters中的每个条目,然后检查parametersObject是否有非空元素,然后将其添加到ListofNonPtyObject


编辑:我添加了一个示例,例如,如果代词definite参数包含多个元素(例如,代词definite:[“I”、“You”、“He”、“She”],),那么如果用户输入与代词definite实体匹配的多个单词,会发生什么情况。然后,我将在try-catch块中以代词definite1的形式获取此参数。

您需要首先循环查看
参数列表。然后,对于每个参数,您需要检查参数是否存在于
parametersObj
中。您可以使用
中的
操作符执行此操作。在相同的if条件下,还可以检查
参数sobj
的值是否为空。如果两个条件都满足,则可以将该值推送到NonPtyObject的
列表中

var listOfNonEmptyObjects = []

listOfParameters.forEach(parameter => {
  if (parameter in parametersObject && parametersObject[parameter].length > 0) {
    listOfNonEmptyObjects.push({[parameter]: parametersObject[parameter]})
  }
})

完全无关 您可以使用过滤器和映射。Object.entries将对象转换为键和值的元组。然后可以过滤空值(即元组的第二个元素)。最后,您可以映射并构造所需的数组

Object.entries(parametersObject)  // Split the parameters object into an array of key-value pairs.
  .filter(([k, v]) => v.length)   // Accept only non-empty parameters by checking the parameter array length.
  .map(([k, v]) => ({[k]: v[0]})) // Convert each key-value pair in the array into an object.

在学习boxdox的解决方案后,我的看法是:

var参数对象={名词:['garden','a random addition for testing'],代词definite:['I'],verbshellappresent:['am'],文章:['the'],动词格值:['working'],介词:['in'],动词finitive:[],副词:[]
var listOfParameters=[“代词限定”、“动词限定”、“动词限定”、“冠词”、“名词”];
var ListofNomptyObject=[];
//让我们看一下列出的每个参数
forEach(参数=>
//如果parametersObject中存在此类参数,请处理其每个值。
(参数对象[参数]| |[])。forEach((项目,索引)=>
//将每个值作为对象推送到非空对象列表中
push({[parameter+(索引?索引:“”)]:item})
)
);

log(非mptyobjects列表)
名词:['garden']
此数组将始终包含单个元素?只需迭代
参数列表
,查看该键是否存在且为非空数组,并将其添加到
非空对象列表
。名词还可以包含更多元素,取决于用户输入。您能否修改示例以显示程序应如何运行?是的,我将在try-catch块中获取参数defined1,并在agent.parameters.defined1中查找索引[1],以获取数组中的第二个条目(如果有)。您好,谢谢您的回答。不幸的是,我不太明白你的解决办法。我如何迭代参数列表,查看该键是否存在,是否为非空数组,并将其添加到非空对象列表中(如上文Salman a所述)?@Finn我猜我误解了你的问题。让我做一个编辑谢谢,它现在正在工作:)这是一个非常好的解决方案。我学到了一些新东西。谢谢你和所有其他人帮助我!很抱歉,我回来后从代码中删除了reduce()。ForEach更简单,我意识到外部reduce毕竟是不必要的,因为我用push()修改了nimptyobjects的列表,所以不需要传递累加器。