【问题标题】:Filtering two arrays based on another array values and also push the unavailable values into another array根据另一个数组值过滤两个数组,并将不可用的值推送到另一个数组中
【发布时间】:2022-01-23 14:52:46
【问题描述】:

我有 2 个数组,一个是“searchEachIndex”,另一个是“data”。

基于“searchEachIndex”数组,我想过滤“data”数组。即,

在 searchEachIndex 数组中,我有 123 个值与数据数组的 employeeId 匹配。

这里应该将对象推入 res 数组 { id: 2, employeeId: 123 }, { id: 3,employeeId: 123 },如果两个值都匹配。 否则将此处不匹配的 searchEachIndex 值 1234、12 推入另一个数组,即 noData 数组。

    let searchEachIndex = [123, 1234, 12]

    let data = [
    {
      id: 1,
      employeId: 121
    },
    {
      id: 2,
      employeId: 123
    },
    {
      id: 3,
      employeId: 123
     }
    ];

    let res=[];

    let noData = [];

    searchEachIndex.forEach(val => {
       data.map(item => {
          if(item.employeId === val) {
           res.push(item)
          }
       })
    })


    console.log('Both emp id and searchEachIndex value matched array', res);

    consolelog('Ids not found array', noData);

实际上我需要如下响应: res : [{ id: 2, employeeId: 123 }, { id: 3,employeeId: 123 }] 和 noData : [1234, 12]

【问题讨论】:

  • searchEachIndex 实际上我需要如下响应: res : [{ id: 2, employeeId: 123 }, { id: 3, employeeId: 123 }] 和 noData : [1234, 12]跨度>
  • 格式化您的问题并将评论放在问题中。将来将所有相关信息放在问题本身中。不是每个人都会通过 cmets

标签: javascript arrays reactjs for-loop filter


【解决方案1】:

您可以将 .map 替换为 .forEach,因为您不需要返回转换后的数组,而只是寻找一个 for 循环。

您还可以保留一个布尔标志,让您知道当前valdata 数组中是否有相应的条目。这样你就可以推送(/不推送)到你的 noData 数组中。

建立在您的代码之上:

let searchEachIndex = [123, 1234, 12]

let data = [
{
  id: 1,
  employeId: 121
},
{
  id: 2,
  employeId: 123
},
{
  id: 3,
  employeId: 123
 }
];

let res=[];

let noData = [];

searchEachIndex.forEach(val => {
   let found = false;
   data.forEach(item => {
      if(item.employeId === val) {
       found = true;
       res.push(item)
      }
   })
   if(!found) noData.push(val);
})

console.log('Both emp id and searchEachIndex value matched array', res);

console.log('Ids not found array', noData);

【讨论】:

  • 谢谢! @Tushar,解释得很好。
【解决方案2】:

您可以使用一个对象来跟踪使用的值并过滤数组。

const
    search = [123, 1234, 12],
    used = Object.fromEntries(search.map(k => [k, false])),
    data = [{ id: 1, employeId: 121 }, { id: 2, employeId: 123 }, { id: 3, employeId: 123 }],
    result = data.filter(({ employeId }) => {
        if (employeId in used) return used[employeId] = true;
    }),
    noData = search.filter(k => !used[k]);

console.log(noData);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢! @尼娜
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2019-05-29
  • 2021-06-20
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多