【问题标题】:Map and Filter to populate array with objects by id映射和过滤器以按 id 用对象填充数组
【发布时间】:2021-05-03 23:01:28
【问题描述】:

我需要用对象填充 id 数组。换句话说,我有。 id 数组:

var orderArray = ["5ace454a2b22e17597d0e694", "5acde7c0f7d2520e3b205971", "5ad2086bf05ad342dc723ea1"]

还有对象数组:

var objectsArray = [ { _id: 5acde7c0f7d2520e3b205971,
    name: 'Dinner',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    created: 2018-04-11T10:47:28.957Z,
    status: true,
    products: [ [Object] ] },
  { _id: 5ace454a2b22e17597d0e694,
    name: 'Test',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    image: 
     { _id: 5ad23ed177bcd07303f62899,
       filename: 'rJKCR2k2f-1523728081111.jpeg',
       destination: 'images',
       binded: true },
    created: 2018-04-11T17:26:34.186Z,
    status: false,
    products: [ [Object], [Object] ] },
  { _id: 5ad2086bf05ad342dc723ea1,
    name: 'Test',
    restaurant: 5a68d8ea17d9e4308e6400c3,
    image: null,
    created: 2018-04-14T13:55:55.449Z,
    status: true,
    products: [] } ]

您可以根据 ID 对对象数组进行排序...或者将 ID 数组映射到对象数组。可能我更喜欢第二种选择。 但是我的方法是行不通的

orderArray.map(id => objectsArray.filter(obj => obj._id == id))

结果应该是:objectsArray按照orderArray中元素的顺序排序

解决方案:我几天前已经打开了这个问题:Merging 2 arrays with different value types

在这里我有同样的问题。 orderArray 是对象数组(不是字符串),因此为了使其工作,我需要应用我之前找到的解决方案(Array.filter 和 Array.find 函数都运行良好): 但以我的方式,它只有在以下情况下才会起作用:

order_array.map(String).map(e => objectsArray.find(a => a._id == e))
//as well as 
order_array.map(String).map(e => objectsArray.filter(a => a._id == e))

【问题讨论】:

  • 你到底在寻找什么输出?
  • 使用find而不是filter,否则你会得到一个额外的嵌套数组。
  • @tricot no 两者都可以正常工作..这里的问题超出了...查看解决方案和引用的帖子
  • @tricot 虽然如果你知道引用帖子的答案 - 我很想听听

标签: javascript arrays


【解决方案1】:

map 第一个数组用第二个数组中的相应元素填充:

var orderArray = ["5ace454a2b22e17597d0e694", "5acde7c0f7d2520e3b205971", "5ad2086bf05ad342dc723ea1"]

var objectsArray = [ { _id: '5acde7c0f7d2520e3b205971',
    name: 'Dinner',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    created: '2018-04-11T10:47:28.957Z',
    status: true,
    products: [ [Object] ] },
  { _id: '5ace454a2b22e17597d0e694',
    name: 'Test',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    image: 
     { _id: '5ad23ed177bcd07303f62899',
       filename: 'rJKCR2k2f-1523728081111.jpeg',
       destination: 'images',
       binded: true },
    created: '2018-04-11T17:26:34.186Z',
    status: false,
    products: [ [Object], [Object] ] },
  { _id: '5ad2086bf05ad342dc723ea1',
    name: 'Test',
    restaurant: '5a68d8ea17d9e4308e6400c3',
    image: null,
    created: '2018-04-14T13:55:55.449Z',
    status: true,
    products: [] } ]
    
 var sorted = orderArray.map((e) => { return objectsArray.find((a) => { return a._id  == e})})
 
 console.log(sorted)

【讨论】:

  • 谢谢@Taki。我也做过。但我有以下输出...... [未定义,未定义,未定义]。 NodeJS 是否支持 ES6?
  • 看来是我做错了。检查并且它有效..可能是一些错字..谢谢
  • 这些是支持 ES6 node.green 的 nodejs 版本,并检查您的 JSON,我将其编辑为在我的 sn-p 中有效(添加引号)
  • 发现问题。如果有兴趣 - 请参阅帖子
【解决方案2】:

你应该能够:

objectsArray.filter(obj => ordersArray.includes(obj._id));

如果我理解正确的话。

【讨论】:

    【解决方案3】:

    使用map/find(而不是filter):

    let mappedArray = orderArray.map(id => objectsArray.find(obj => obj._id == id));
    

    其中maps orderArray 到一个对象数组,其中finds 来自objectsArray 的对象与当前_id 具有相同的_id

    注意:如果objectsArray中没有与id匹配的对象,则返回null

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2023-01-21
      • 1970-01-01
      • 2019-09-29
      • 2019-03-30
      • 2020-06-27
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多