我正在尝试基于三个表单输入来动态创建查询字符串。仅将使用的输入添加到字符串中。
为此,我使用了以下内容:
let filter = { CustomerName: "Me", AccountNumber: "", "Author/Title": "You" }
const result = Object.entries(filter).map(([key, value]) => {
if (value) {
// if input was used, return given string
console.log(`${key} eq '${value}'`)
return `${key} eq '${value}'`
}
})
console.log(result); // output is ["CustomerName eq 'Me'", undefined, "Author/Title eq 'You'"]
let filterStr = ''
result.forEach(element => {
if (element) {
filterStr += ` and ${element}`
}
});
console.log(filterStr.replace(" and", "")) // output is "CustomerName eq 'Me' and Author/Title eq 'You'"
最终输出是正确的,但是这似乎是获得最终结果的一种冗余方法。
我如何清理它以减少冗余并提高可读性?
答案 0 :(得分:1)
如果这是您想要的,请尝试下面的代码。
let filter = { CustomerName: "Me", AccountNumber: "", "Author/Title": "You" }
let str = Object.keys(filter)
.filter(key => filter[key])
.map(key => `${key} eq '${filter[key]}'`)
.join(' and ');
console.log(str);
答案 1 :(得分:0)
您可以先进行过滤,然后获取映射的字符串,并在最后两个值之间仅使用一个和将结果联接起来。
const nice = array => array.concat(array.splice(-2, 2).join(' and ')).join(', ');
var filter = { foo: 'bar', CustomerName: "Me", AccountNumber: "", "Author/Title": "You" },
result = Object
.entries(filter)
.filter(([, value]) => value)
.map(([key, value]) => `${key} eq '${value}'`);
console.log(nice(result));
答案 2 :(得分:0)
let filter = { CustomerName: "Me", AccountNumber: "", "Author/Title": "You"}
let formattedObj = Object.keys(filter).filter(key => filter[key]).map(key => `${key} eq \'${filter[key]}\'`)
console.log(formattedObj.join(' and '))