Javascript:查找数组中所有具有特定键值的元素

时间:2019-11-14 11:08:38

标签: javascript arrays

我有以下Javascript数组:

ARRAY ONE:
[ TextRow { v_id: 3000 },
  TextRow { v_id: 3001 },
  TextRow { v_id: 3002 } ]

ARRAY TWO:
[ TextRow {
      s_id: 'S001',
      v_id: 3000,
      type: 'control' },
  TextRow {
      s_id: 'S002',
      v_id: 3001,
      type: 'mut' },
  TextRow {
      s_id: 'S003',
      v_id: 3001,
      type: 'mut' },
  TextRow {
      s_id: 'S005',
      v_id: 3001,
      type: 'control' },
  TextRow {
      s_id: 'S008',
      v_id: 3002,
      type: 'mut' } ]

对于数组1中的每个元素,我想得到数组2中所有元素的数组,其中v_id等于数组1中的v_id。例如,对于v_id = 3001,我想获取数组2中的所有元素,其中v_id = 3001在单独的数组中。但是,我不确定执行此任务的最佳方法是什么,以及Javascript是否已经具有一些可以帮助我完成此任务的现有功能。我问这个问题是因为我的第二个数组有1000多个元素,我想知道是否有一种有效的方法来执行此操作,而不是仅使用嵌套的for循环遍历数组的元素。任何见解都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

您可以在ARRAY_ONE上执行.forEach(或.map),然后在ARRAY_TWO上执行.filter以获取匹配的元素。

我添加了getMatches函数,以使逻辑更加清楚。

const ARRAY_ONE =
[  { v_id: 3000 },
   { v_id: 3001 },
   { v_id: 3002 } ];

const ARRAY_TWO =
[  {
      s_id: 'S001',
      v_id: 3000,
      type: 'control' },
   {
      s_id: 'S002',
      v_id: 3001,
      type: 'mut' },
   {
      s_id: 'S003',
      v_id: 3001,
      type: 'mut' },
   {
      s_id: 'S005',
      v_id: 3001,
      type: 'control' },
   {
      s_id: 'S008',
      v_id: 3002,
      type: 'mut' } ];
      
function getMatches(v_id, array) {
    return array.filter(el => el.v_id === v_id);
}

const result = ARRAY_ONE.map(v => { 
    return { array_one_id: v.v_id, matches: getMatches(v.v_id, ARRAY_TWO) };
});

console.log("Result:", result);

答案 1 :(得分:0)

您可以使用.forEach()方法遍历第一个数组。

然后,您可以将数组2上的.filter()方法用作forEach的回调函数。

您应该有类似的东西:

arrayOne.forEach( elmArr1 => arrayTwo.filter( elmArr2 => elmArr1.v_id == elmArr2.v_id ) )

答案 2 :(得分:0)

如果要过滤而不进行分组:

const firstArray =
[  { v_id: 3000 },
   { v_id: 3001 },
   { v_id: 3002 }
];

const secondArray =
[  {
      s_id: 'S001', v_id: 3000, type: 'control' },
   {
      s_id: 'S002', v_id: 3001, type: 'mut' },
   {
      s_id: 'S003', v_id: 3001, type: 'mut' },
   {
      s_id: 'S005', v_id: 3001, type: 'control' },
   {
      s_id: 'S008', v_id: 3002, type: 'mut' }
];    

const result = secondArray.filter(f=>
    firstArray.some(s=> s.v_id == f.v_id));

console.log(result);

如果您想按键对项目进行分组,则可以使用reduce方法来完成:

const firstArray =
[  { v_id: 3000 },
   { v_id: 3001 },
   { v_id: 3002 }
];

const secondArray =
[  {
      s_id: 'S001', v_id: 3000, type: 'control' },
   {
      s_id: 'S002', v_id: 3001, type: 'mut' },
   {
      s_id: 'S003', v_id: 3001, type: 'mut' },
   {
      s_id: 'S005', v_id: 3001, type: 'control' },
   {
      s_id: 'S008', v_id: 3002, type: 'mut' }
];    

const keys = firstArray.reduce((a, {v_id}) => {
a[v_id] = a[v_id]  || 1;
return a;
}, {});

const allKeys = secondArray.reduce((a, {s_id, v_id, type}) => {
a[v_id] = a[v_id] || {values: []};
a[v_id].values.push({s_id, v_id, type});
return a;
}, {})

Object.keys(allKeys).forEach(k=>{
if( !keys.hasOwnProperty(k))
    delete allKeys[k];
})

console.log(allKeys);