【问题标题】:How to build a new Array of Objects from existing Array of Objects, filtered to match a list of keys如何从现有的对象数组构建一个新的对象数组,过滤以匹配键列表
【发布时间】:2021-12-23 06:52:37
【问题描述】:

我有一个对象数组,例如:

[
  {
    "fName": "Jon",
    "lName": "Doe",
    "age": "30",
    "shirtSize": "M"
  },
  {
    "fName": "Jane",
    "lName": "Foe",
    "age": "25",
    "shirtSize": "M"
  },
  ...
]

我还有一个键列表,例如:

["age", "shirtSize"]

我想获取对象数组,并构建一个与键列表数组匹配的新对象数组,有效地过滤对象数组以仅具有我想要的键/值对。以上是例子,真实的数据集当然更啰嗦。我已经在下面的算法中强制使用它,并且正如预期的那样,由于我在地图中的循环,它根本不是很高效。我的结果是这样的:

    [
      {
        "age": "30",
        "shirtSize": "M"
      },
      {
        "age": "25",
        "shirtSize": "M"
      },
      ...
    ]

我没有使用 lodash 之类的东西。如何提高此性能?

const data = [
  {
    "fName": "Jon",
    "lName": "Doe",
    "age": "30",
    "shirtSize": "M"
  },
  {
    "fName": "Jane",
    "lName": "Foe",
    "age": "25",
    "shirtSize": "M"
  }
];
const keyList = ["age", "shirtSize"];

const filteredDataset = data.map((elem) => {
  let tempHolder = {};
  for (let key of keyList) {
    tempHolder[key] = elem[key];
  }
  return tempHolder;
});

return filteredDataset;

【问题讨论】:

  • 我认为如果没有两个循环,或者至少相当于两个循环,你就无法做到这一点。 data 的每个元素一个,keylist 的每个元素一个。但是,您应该在映射中声明 tempHolder,否则您将一遍又一遍地将相同的对象添加到数组中。
  • “在地图内循环” - 按顺序排列,没有比这更好的了。但是,您的代码似乎有问题 - 例如tempHolder 似乎总是同一个对象。我认为您发布的结果并不是您从该代码中实际得到的结果。
  • 此代码错误。由于tempHolder 不会为每个对象重新创建,因此它将仅输出一个对象代替两个对象的过滤结果。
  • 谢谢大家,我的手写示例在错误的范围内声明了 tempHolder

标签: javascript node.js algorithm data-structures javascript-objects


【解决方案1】:

您可以更声明性地表达相同的算法:

const select = (props) => (objs) =>
  objs .map (o => Object .fromEntries (props .map (p => [p, o[p]])))

const items = [{fName: "Jon", lName: "Doe", age: "30", shirtSize: "M"}, {fName: "Jane", lName: "Foe", age: "25", shirtSize: "M"}]

console .log (select (["age", "shirtSize"]) (items))

【讨论】:

    【解决方案2】:
    var results = [];
    for(var person of data){
        var obj = {};
        for(var key of keyList){
            obj[key] = person[key];
        }
        results.push(obj);
    }
    

    第一个循环遍历数据,内部循环遍历 keyList 并将这些属性添加到临时对象,然后将其推送到结果数组。

    编辑:您的代码基本相同,您的代码只是使用 map 来迭代而不是 for...of 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多