javascript - 以下代码获得预期结果的更好方法

标签 javascript arrays reduce

所以情况是我有以下数组作为我的输入:

[
  {
    "failureMessage": "failed",
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4855"
      }
    },
    "testSetName": "search"
  },
  {
    "failureMessage": null,
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4856"
      }
    },
    "testSetName": "download"
  },
  {
    "failureMessage": "failed 2",
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4857"
      }
    },
    "testSetName": "search"
  },
  {
    "failureMessage": null,
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4858"
      }
    },
    "testSetName": "download"
  },
  {
    "failureMessage": "failed",
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4859"
      }
    },
    "testSetName": "backgrounds"
  },
  {
    "failureMessage": null,
    "data": {
      "statusCode": 201,
      "body": {
        "id": "14975",
        "key": "KEY-4860"
      }
    },
    "testSetName": "backgrounds"
  }
]

上面的数组包含保存有关测试用例的数据的对象

我想要一个像这样的数组:

[
  {
    "testSetName": "search",
    "testCases": ["KEY-4855", "KEY-4857"]
  },
  {
    "testSetName": "download",
    "testCases": ["KEY-4856", "KEY-4858"]
  },...
]

上面的数组包含对象,这些对象保存测试集的名称(testSetName)以及属于该测试集的所有测试用例作为testCases

现在,我的代码如下:

  let results = testCasesObject.reduce(function (previousArr, currElement, currIndex) {

      if (previousArr.length === 0) {
        let obj = {testSetName: currElement.testSetName, testCases: []};
        obj.testCases.push(currElement.data.body.key);
        previousArr.push(obj);
      }
      else {
        let isAdded = false;
        for (let index = 0; index < previousArr.length; index += 1) {
          if (previousArr[index].testSetName === currElement.testSetName) {
            previousArr[index].testCases.push(currElement.data.body.key);
            isAdded = true;
          }
        }
        if (!isAdded) {
          let obj = {testSetName: currElement.testSetName, testCases: []};
          obj.testCases.push(currElement.data.body.key);
          previousArr.push(obj);
        }
      }

        return previousArr;
    }, []);

    console.log(results);

我的代码生成准确的结果,但我希望提高其效率,并且我需要这方面的帮助。

最佳答案

您可以按 testSetName 进行分组,并通过查找已插入的项目来减少数组。

var array = [{ failureMessage: "failed", data: { statusCode: 201, body: { id: "14975", key: "KEY-4855" } }, testSetName: "search" }, { failureMessage: null, data: { statusCode: 201, body: { id: "14975", key: "KEY-4856" } }, testSetName: "download" }, { failureMessage: "failed 2", data: { statusCode: 201, body: { id: "14975", key: "KEY-4857" } }, testSetName: "search" }, { failureMessage: null, data: { statusCode: 201, body: { id: "14975", key: "KEY-4858" } }, testSetName: "download" }, { failureMessage: "failed", data: { statusCode: 201, body: { id: "14975", key: "KEY-4859" } }, testSetName: "backgrounds" }, { failureMessage: null, data: { statusCode: 201, body: { id: "14975", key: "KEY-4860" } }, testSetName: "backgrounds" }],            
    result = array.reduce((r, { testSetName, data: { body: { key } } }) => {
        var item = r.find(o => o.testSetName === testSetName);
        if (item) {
            item.testCases.push(key);
        } else {
            r.push({ testSetName, testCases: [key] });
        }
        return r;
    }, []);
   
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 以下代码获得预期结果的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50694679/

相关文章:

javascript - 如何校正裁剪后的图像

javascript - 使用 Ramda 将 reducer 转换为传感器

javascript - 在这个reduce方法末尾添加括号的目的是什么?

couchdb - "merge"查看整理成 CouchDB 中有用的输出

javascript - 如何防止我的 PhoneGap webView 在 Android 上捕获 native 图片后刷新内容?

javascript - VueJS/Vue Router - 从列表项创建详细信息页面?

javascript - 如何做出正确 react 的请求?

javascript - 减少比较两个数组的时间。时间复杂度

javascript - 使用循环构建对象数组并使用来自相同迭代的计算

c# - 二进制搜索算法 : Text File for each record in array