如何使用 NodeJS 从列表中排除特定字符串

Posted

技术标签:

【中文标题】如何使用 NodeJS 从列表中排除特定字符串【英文标题】:How to exclude specific string from list using NodeJS 【发布时间】:2021-12-11 11:07:28 【问题描述】:

我已经使用 NodeJS 动态生成字符串列表的用例,如果给定字符串是 null 我应该从列表中排除该字符串。 例如: 我有productIDproductNameproductPriceproductType。如果productIDnull,那么productID 字段应该从列表中排除,如果productNamenull,那么productName 应该被排除,依此类推。如果productIDproductNamenull,那么这两个字段都应该从列表中排除。

我在下面有示例代码,但这不是一种有效的方法,有人可以建议我们如何使用 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 从列表中排除特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从更新中排除特定的git子模块?

如何在nodejs中获取文件夹大小,排除具有glob模式的某些路径?

如何从 Serilog 中排除特定的异常类型?

如何从 ack (ack-grep) 中排除特定文件?

使用 vue-cli 设置时如何从 babel-loader 中排除特定文件?

如何从 spring-boot-starter-parent 中排除特定依赖项