如何使用 NodeJS 从列表中排除特定字符串
Posted
技术标签:
【中文标题】如何使用 NodeJS 从列表中排除特定字符串【英文标题】:How to exclude specific string from list using NodeJS 【发布时间】:2021-12-11 11:07:28 【问题描述】:我已经使用 NodeJS 动态生成字符串列表的用例,如果给定字符串是 null
我应该从列表中排除该字符串。 例如: 我有productID
、productName
、productPrice
和productType
。如果productID
是null
,那么productID
字段应该从列表中排除,如果productName
是null
,那么productName
应该被排除,依此类推。如果productID
和productName
是null
,那么这两个字段都应该从列表中排除。
我在下面有示例代码,但这不是一种有效的方法,有人可以建议我们如何使用 NodeJS 以更好的方式实现这个用例。
const test = async () =>
console.log('generate params')
var params;
var productID;
var productName = "APPLE";
var productPrice = "12";
var productType = "Electronics"
if (productID == null)
params =
"PRODUCT_NAME": productName,
"PRODUCT_PRICE": productPrice,
"PRODUCT_TYPE": productType
else if (productName == null)
params =
"PRODUCT_ID": productID,
"PRODUCT_PRICE": productPrice,
"PRODUCT_TYPE": productType
else if (productPrice == null)
params =
"PRODUCT_ID": productID,
"PRODUCT_NAME": productName,
"PRODUCT_TYPE": productType
else if (productType == null)
params =
"PRODUCT_ID": productID,
"PRODUCT_NAME": productName,
"PRODUCT_PRICE": productPrice,
console.log("param value", params)
test()
TypeScript
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type ' PRODUCT_ID: string[]; PRODUCT_NAME: string; PRODUCT_PRICE: string; PRODUCT_TYPE: string; '.
No index signature with a parameter of type 'string' was found on type ' PRODUCT_ID: string[]; PRODUCT_NAME: string; PRODUCT_PRICE: string; PRODUCT_TYPE:
product.ts
export interface ProductInput
productID: Array<string>;
productName: string;
productPrice: string;
productType: string;
shippingDate: Date;
DeliveryDate: Date;
export interface ProductOutput
status: string;
//Lambda function
export const productDetails = async (event: ProductInput):
Promise<ProductOutput> =>
var PRODUCT_ID = event.productID;
var PRODUCT_NAME = event.productName;
var PRODUCT_PRICE = event.productPrice;
var PRODUCT_TYPE = event.productType;
const collection = PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_TYPE ;
const parameters = Object.keys(collection).reduce((acc, curr) =>
if (collection[curr]) acc[curr] = collection[curr];
return acc;
, );
return
status: 'success'
;
;
【问题讨论】:
【参考方案1】:您可以简单地创建一个数据结构(在这种情况下为对象)并在其中添加所有属性
const collection = productID, productName, productPrice, productType ;
如果不为null,则可以使用reduce将其收集到单个对象中
const params = Object.keys(collection).reduce((acc, curr) =>
if (collection[curr]) acc[curr] = collection[curr];
return acc;
, );
单线
const params = Object.keys(collection).reduce((acc, curr) => (collection[curr] ? ...acc, [curr]: collection[curr] : acc), );
const test = async () =>
console.log("generate params");
var productID;
var productName = "APPLE";
var productPrice = "12";
var productType = "Electronics";
const collection = productID, productName, productPrice, productType ;
const params = Object.keys(collection).reduce((acc, curr) =>
if (collection[curr]) acc[curr] = collection[curr];
return acc;
, );
console.log("param value", params);
;
test();
已编辑
单线
const params = Object.keys(collection).reduce((acc, curr) => collection[curr] ? [...acc, mapping[curr]]: acc, []);
var productID;
var productName = "APPLE";
var productPrice = "12";
var productType = "Electronics";
const collection = productID, productName, productPrice, productType ;
const mapping =
produtID: "PRODUCT_ID",
productName: "PRODUCT_NAME",
productPrice: "PRODUCT_PRICE",
productType: "PRODUCT_TYPE",
;
const params = Object.keys(collection).reduce((acc, curr) =>
if (collection[curr]) acc.push(mapping[curr]);
return acc;
, []);
console.log("param value", params);
【讨论】:
谢谢@decpk。这行得通!我想将非空字段推送到数组,但在推送时我必须使用自定义映射字段。例如,如果 productID 为 null,我想推送 productName、productPrice 和 productType,但在推送到数组时,它应该像这样 const productArray = ["PRODUCT_NAME", "PRODUCT_PRICE", "PRODUCT_TYPE"] productName 应该映射到 PRODUCT_NAME, productPrice - > PRODUCT_PRICE 等等。我们怎样才能做到这一点? @DaveBrady 代码已编辑。看看 再次感谢@decpk,我在 Typescript 中也尝试了相同的方法,但收到此错误元素隐含地具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型 ' PRODUCT_ID:字符串[]; PRODUCT_NAME:字符串; PRODUCT_PRICE:字符串; PRODUCT_TYPE:字符串; '。在类型 ' PRODUCT_ID: string[]; 上找不到具有类型参数的索引签名。 PRODUCT_NAME:字符串; PRODUCT_PRICE:字符串; PRODUCT_TYPE: 我已经编辑了包含打字稿程序和错误详细信息的原始帖子。你能帮忙吗?【参考方案2】:ES6+
的最短路径params =
"PRODUCT_ID": null,
"PRODUCT_NAME": 'productName',
"PRODUCT_PRICE": 'productPrice',
"PRODUCT_TYPE": 'productType'
console.log(params)
//Removes only null
params = Object.entries(params).reduce((a,[k,v]) => (v === null ? a : (a[k]=v, a)), )
console.log(params)
【讨论】:
【参考方案3】:/* if first value is falsy, use the second value */
params =
"PRODUCT_ID": productName | null,
"PRODUCT_NAME": productName | null,
"PRODUCT_PRICE": productPrice | null,
"PRODUCT_TYPE": productType | null
/*
and if you want to remove keys that are null
( i don't know why you would want to do this)
import omitBy and isNull from lodash and do the following
*/
return( _.omitBy( params, _.isNull ));
忘记了你需要在 markdown 中转义下划线,所以我不得不编辑
【讨论】:
另外,由于这段代码中没有进行 I/O,所以没有必要将这个函数声明为 async以上是关于如何使用 NodeJS 从列表中排除特定字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在nodejs中获取文件夹大小,排除具有glob模式的某些路径?