【问题标题】:How to use an array of strings to filter an array of objects? [duplicate]如何使用字符串数组过滤对象数组? [复制]
【发布时间】:2021-11-12 14:57:54
【问题描述】:

给定一个对象数组:

people = [
    {id: "1", name: "abc", gender: "m", age:"15", country:"USA" },
    {id: "2", name: "def", gender: "m", age:"25", country:"BRA" },
    {id: "3", name: "ghi", gender: "f", age:"05", country:"CHI" },
    {id: "4", name: "jkl", gender: "m", age:"35", country:"RUS" },
    {id: "5", name: "mno", gender: "m", age:"41", country:"JAP" },
    {id: "6", name: "pqr", gender: "f", age:"30", country:"COL" },
    {id: "7", name: "stu", gender: "f", age:"31", country:"CAN" },
    {id: "8", name: "vwx", gender: "m", age:"78", country:"USA" },
]

还有一系列想要的键:

wantedKeys = ["name", "age", "country"]

预期输出:

peopleFiltered = [
    {name: "abc", age:"15", country:"USA" },
    {name: "def", age:"25", country:"BRA" },
    {name: "ghi", age:"05", country:"CHI" },
    {name: "jkl", age:"35", country:"RUS" },
    {name: "mno", age:"41", country:"JAP" },
    {name: "pqr", age:"30", country:"COL" },
    {name: "stu", age:"31", country:"CAN" },
    {name: "vwx", age:"78", country:"USA" },
]

如何过滤people数组以返回仅包含wantedKeys数组中的项目的新对象数组?

【问题讨论】:

  • 请edit您的问题表明您已经完成了哪些研究以及您根据该研究所做的任何尝试。
  • 嗨,向我们展示你的尝试。
  • 我在 Stack 上查看了 20 多个线程,但找不到。这个话题对我的问题的回答是肯定的。谢谢分享。

标签: javascript arrays object


【解决方案1】:

解决方案

reduce 可能还有更短的方法,但这应该是一个有效的起点。

var peopleFiltered = people.map(person => {
  var obj = {};
  wantedKeys.forEach((key) => obj[key] = person[key]);
  return obj;
});

工作演示

people = [{
    id: "1",
    name: "abc",
    gender: "m",
    age: "15",
    country: "USA"
  },
  {
    id: "2",
    name: "def",
    gender: "m",
    age: "25",
    country: "BRA"
  },
  {
    id: "3",
    name: "ghi",
    gender: "f",
    age: "05",
    country: "CHI"
  },
  {
    id: "4",
    name: "jkl",
    gender: "m",
    age: "35",
    country: "RUS"
  },
  {
    id: "5",
    name: "mno",
    gender: "m",
    age: "41",
    country: "JAP"
  },
  {
    id: "6",
    name: "pqr",
    gender: "f",
    age: "30",
    country: "COL"
  },
  {
    id: "7",
    name: "stu",
    gender: "f",
    age: "31",
    country: "CAN"
  },
  {
    id: "8",
    name: "vwx",
    gender: "m",
    age: "78",
    country: "USA"
  },
]

wantedKeys = ["name", "age", "country"]

var peopleFiltered = people.map(person => {
  var obj = {};
  wantedKeys.forEach((key) => obj[key] = person[key]);
  return obj;
});

console.log(peopleFiltered);

【讨论】:

    【解决方案2】:

    有一个非常方便的 lodash 函数,pick 正是这样做的。我们可以结合Array.map()来得到想要的结果:

    people = [ {id: "1", name: "abc", gender: "m", age:"15", country:"USA" }, {id: "2", name: "def", gender: "m", age:"25", country:"BRA" }, {id: "3", name: "ghi", gender: "f", age:"05", country:"CHI" }, {id: "4", name: "jkl", gender: "m", age:"35", country:"RUS" }, {id: "5", name: "mno", gender: "m", age:"41", country:"JAP" }, {id: "6", name: "pqr", gender: "f", age:"30", country:"COL" }, {id: "7", name: "stu", gender: "f", age:"31", country:"CAN" }, {id: "8", name: "vwx", gender: "m", age:"78", country:"USA" }, ]
    
    wantedKeys = ["name", "age", "country"];
    
    let result = people.map(p => _.pick(p, wantedKeys));
    console.log('Result:');
    result.forEach(r => console.log(JSON.stringify(r)))
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" referrerpolicy="no-referrer"></script>

    也是一种普通的 JavaScript 方法,使用 Object.fromEntries() 和 Array.map():

    people = [ {id: "1", name: "abc", gender: "m", age:"15", country:"USA" }, {id: "2", name: "def", gender: "m", age:"25", country:"BRA" }, {id: "3", name: "ghi", gender: "f", age:"05", country:"CHI" }, {id: "4", name: "jkl", gender: "m", age:"35", country:"RUS" }, {id: "5", name: "mno", gender: "m", age:"41", country:"JAP" }, {id: "6", name: "pqr", gender: "f", age:"30", country:"COL" }, {id: "7", name: "stu", gender: "f", age:"31", country:"CAN" }, {id: "8", name: "vwx", gender: "m", age:"78", country:"USA" }, ]
     
    wantedKeys = ["name", "age", "country"];
    let result = people.map(p => Object.fromEntries(wantedKeys.map(k => [k,p[k]])));
    console.log('Result:');
    result.forEach(r => console.log(JSON.stringify(r)))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 我还不知道这个lodash 函数。感谢你的分享。很遗憾,我无法在公司环境中添加库。
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 2015-03-24
    • 2022-01-13
    • 2020-08-15
    • 1970-01-01
    • 2020-12-16
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多