首页 > 解决方案 > 如何映射数组并使用索引以消除空值?

问题描述

我有两个数组keyValsrows定义如下:

    keyVals = 
    [
      "Status",
      "ErrorHeading",
      "ErrorDetail"
    ]
    
rows =
[
  {
    "Hostname": "ABC",
    "name": "Check1",
    "Status": "PASS",
    "ErrorHeading": "",
    "ErrorDetail": ""
  },
  {
    "Hostname": "ABC",
    "name": "Check2",
    "Status": "PASS",
    "ErrorHeading": "",
    "ErrorDetail": ""
  },
  {
    "Hostname": "ABC",
    "name": "Check3",
    "Status": "FAIL",
    "ErrorHeading": "Heading3",
    "ErrorDetail": "ErrorDetails3"
  }
]

我编写了以下代码来生成Res

function dArray(rows, keyVals) {
    const response = Object.values(rows.reduce((res, {Hostname, name, ...o}) => {
        res[Hostname] = res[Hostname] || {Hostname};
        keyVals.forEach(kv => res[Hostname][name + kv] = o[kv]);
        return res;
    }, {}));
    return response;
}

const Res = dArray(rows, keyVals);

Res值如下所示:

Res = 
[
  {
    "Hostname": "ABC",
    "Check1kStatus": "PASS",
    "Check1ErrorHeading": "",
    "Check1ErrorDetail": "",
    "Check2Status": "PASS",
    "Check2ErrorHeading": "",
    "Check2ErrorDetail": "",
    "Check3Status": "FAIL",
    "Check3ErrorHeading": "Heading3",
    "Check3ErrorDetail": "ErrorDetails3"
  }
]

我想修改function dArray(rows, keyVals)Res排除所有空值,如下所示:

Res = 
[
  {
    "Hostname": "ABC",
    "Check1kStatus": "PASS",
    "Check2Status": "PASS",
    "Check3Status": "FAIL",
    "Check3ErrorHeading": "Heading3",
    "Check3ErrorDetail": "ErrorDetails3"
  }
]

标签: javascriptnode.jsarraysdictionarynode-modules

解决方案


function dArray(rows, keyVals) {
  const response = Object.values(rows.reduce((res, {Hostname, name}) => {
      res[Hostname] = res[Hostname] || {Hostname};
      keyVals.forEach(kv => res[Hostname][name + kv] = o[kv]);
      return res;
  }, {}));

  let keys=Object.keys(response[0]);
  for(let i=0,l=keys.length;i<l;i++){
    if(!response[0][keys[i]]){
      delete response[0][keys[i]];
    }  
  }

  return response;
}

推荐阅读