1

我有两个数组,这是第一个数组:

 const users= [
  {
    id: '112',
    firstName: 'a',
    lastName: 'b'
  },
  {
    id: '118',
    firstName: 'c',
    lastName: 'd'
  },

  {
    id: '113',
    firstName: 'e',
    lastName: 'f'
  },

  {
    id: '115',
    firstName: 'g',
    lastName: 'h'
  },
  {
    id: '114',
    firstName: 'i',
    lastName: 'j'
  },
  {
    id: '1151',
    firstName: 'o',
    lastName: 'p'
  },
  {
    id: '1171',
    firstName: 'q',
    lastName: 'r'
  }
]; 

这是第二个:

 const user2 = [
{
      id: '112',
      firstName: 'a',
      lastName: 'b'
},
      {
      id: '113',
      firstName: 'e',
      lastName: 'f'
    },
    {
      id: '114',
      firstName: 'i',
      lastName: 'j'
    },
]

我想要什么,根据值比较这两个数组id,如果id两个数组相等。我想为两个数组中相等的数组查找users索引id。我尝试按filter方法进行比较并尝试过findIndex,但它不起作用。

编辑:

       const result = this.users.filter((obj1) => {
  return user2.some((obj2) => {
    return obj1.id=== obj2.id;          // unique id
  });
 });

我不确定如何找到索引。预期输出返回users数组中id相等的user2数组的索引

4

7 回答 7

2

试试这个:

const myUsers = users.filter(user => user2.filter(usr => usr.id === user.id).length)
于 2020-06-24T11:13:19.620 回答
2

您可以将users数组简化为由用户 ID 索引的对象:

const users=[{id:'112',firstName:'a',lastName:'b'},{id:'118',firstName:'c',lastName:'d'},{id:'113',firstName:'e',lastName:'f'},{id:'115',firstName:'g',lastName:'h'},{id:'114',firstName:'i',lastName:'j'},{id:'1151',firstName:'o',lastName:'p'},{id:'1171',firstName:'q',lastName:'r'}];
const user2=[{id:'112',firstName:'a',lastName:'b'},{id:'113',firstName:'e',lastName:'f'},{id:'114',firstName:'i',lastName:'j'},{id:'500',firstName:'i',lastName:'s'},];

const reducedUsers = users.reduce((carry, item, index) => (carry[item.id] = {...item, index}, carry), {});

for (let user of user2) {
  const index = reducedUsers.hasOwnProperty(user.id) ? reducedUsers[user.id].index : -1;
  console.log(`${user.firstName} ${user.lastName} has index ${index} in users`);
}

于 2020-06-24T11:16:59.460 回答
0

您可以使用mapfilter

const users= [
  {
    id: '112',
    firstName: 'a',
    lastName: 'b'
  },
  {
    id: '118',
    firstName: 'c',
    lastName: 'd'
  },

  {
    id: '113',
    firstName: 'e',
    lastName: 'f'
  },

  {
    id: '115',
    firstName: 'g',
    lastName: 'h'
  },
  {
    id: '114',
    firstName: 'i',
    lastName: 'j'
  },
  {
    id: '1151',
    firstName: 'o',
    lastName: 'p'
  },
  {
    id: '1171',
    firstName: 'q',
    lastName: 'r'
  }
]; 

 const user2 = [
{
      id: '112',
      firstName: 'a',
      lastName: 'b'
},
      {
      id: '113',
      firstName: 'e',
      lastName: 'f'
    },
    {
      id: '114',
      firstName: 'i',
      lastName: 'j'
    },
]

function filterArrays(arr1, arr2){
  return arr1.map((el1) => {
     return arr2.filter((el2) => {
        return el2.id == el1.id;
     })
   }).filter((el) => el.length > 0);
 }
 
 console.log(filterArrays(users, user2))

于 2020-06-24T11:16:13.560 回答
0

如果我理解正确,您有兴趣从两个数组中获取索引

const users = [{
    id: '112',
    firstName: 'a',
    lastName: 'b'
  },
  {
    id: '118',
    firstName: 'c',
    lastName: 'd'
  },

  {
    id: '113',
    firstName: 'e',
    lastName: 'f'
  },

  {
    id: '115',
    firstName: 'g',
    lastName: 'h'
  },
  {
    id: '114',
    firstName: 'i',
    lastName: 'j'
  },
  {
    id: '1151',
    firstName: 'o',
    lastName: 'p'
  },
  {
    id: '1171',
    firstName: 'q',
    lastName: 'r'
  }
];

const user2 = [{
    id: '112',
    firstName: 'a',
    lastName: 'b'
  },
  {
    id: '113',
    firstName: 'e',
    lastName: 'f'
  },
  {
    id: '114',
    firstName: 'i',
    lastName: 'j'
  },
];

function filterArrays(arr1, arr2) {
  return arr1.reduce((tmp, x, xi) => {
    const index = arr2.findIndex(y => x.id === y.id);

    if (index === -1) {
      return tmp;
    }

    tmp.push({
      userInfos: x,
      arrayIndex1: xi,
      arrayIndex2: index,
    });

    return tmp;
  }, []);
}

console.log(filterArrays(users, user2));

于 2020-06-24T11:24:07.517 回答
0

我很确定 lodash 的 intersectionBy 方法应该可以解决问题。

https://lodash.com/docs/4.17.15#intersectionBy

// The _.property iteratee shorthand.
_.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }]

“此方法与 _.intersection 类似,只是它接受 iteratee,它为每个数组的每个元素调用以生成比较它们的标准。结果值的顺序和引用由第一个数组确定。iteratee 是用一个参数调用:(值)。”

于 2020-06-24T11:25:15.127 回答
0
    const user2 = [
{
      id: '112',
      firstName: 'a',
      lastName: 'b'
},
      {
      id: '113',
      firstName: 'e',
      lastName: 'f'
    },
    {
      id: '114',
      firstName: 'i',
      lastName: 'j'
    },
]

const users= [
  {
    id: '112',
    firstName: 'a',
    lastName: 'b'
  },
  {
    id: '118',
    firstName: 'c',
    lastName: 'd'
  },

  {
    id: '113',
    firstName: 'e',
    lastName: 'f'
  },

  {
    id: '115',
    firstName: 'g',
    lastName: 'h'
  },
  {
    id: '114',
    firstName: 'i',
    lastName: 'j'
  },
  {
    id: '1151',
    firstName: 'o',
    lastName: 'p'
  },
  {
    id: '1171',
    firstName: 'q',
    lastName: 'r'
  }
]; 

const user2Id = user2.map(user => user.id);

users.forEach((user,i) => {
  if (user2Id.indexOf(user.id) > 0) {
    console.log(user.id + " is present in user2 array at position " + user2Id.indexOf(user.id));
  }
  
});
于 2020-06-24T11:25:58.067 回答
0

您可以使用 aSet并执行以下操作:

function findCommonIndices(array1, array2) {
    const tempSet = new Set();

    array1.forEach(arr => {
        tempSet.add(arr.id);
    });

    const foundIndices = [];

    array2.forEach((arr, index) => {
        if (tempSet.has(arr.id)) {
            foundIndices.push(index);
        }
    });

    return foundIndices;
}
于 2020-06-24T11:29:29.937 回答