Split array of objects into 2 arrays of matching and non-matching items

const users = 
[
  {
    _id: "5fbfa729fc46a415ce5503a6",
    first_name: 'Allen',
    last_name: 'Border',
    timestamp: 1606395689121,
    key: [ "5fbf6f91aff7f3320a906547", "5fbfa748fc46a415ce5503a8" ]
  },
  {
    _id: "5fbfa6fbfc46a415ce5503a4",
    first_name: 'james',
    last_name: 'roger',
    timestamp: 1606395689125
  },
  {
    _id: "5fbf6f91aff7f3320a906547",
    first_name: 'david',
    last_name: 'gosh',
    timestamp: 1606395689130,
    key: [ "5fbfa729fc46a415ce5503a6" ]
  },
  {
    _id: "5e4e74eb380054797d9db623",
    first_name: 'Ricky',
    last_name: 'bichel',
    timestamp: 1606395689131
  }
]

const user_id = "5fbfa748fc46a415ce5503a8";

how to seperate match not match data if user_id matched with users.key it should have matched data that does not match should have notMatch data. can we separate two results match and not match records ?

Does not work

const result = users.key.indexOf(user_id);

console.log(users.storyMute)

Answer

You may use Array.prototype.reduce() the following way:

const users=[{_id:"5fbfa729fc46a415ce5503a6",first_name:"Allen",last_name:"Border",timestamp:1606395689121,key:["5fbf6f91aff7f3320a906547","5fbfa748fc46a415ce5503a8"]},{_id:"5fbfa6fbfc46a415ce5503a4",first_name:"james",last_name:"roger",timestamp:1606395689125},{_id:"5fbf6f91aff7f3320a906547",first_name:"david",last_name:"gosh",timestamp:1606395689130,key:["5fbfa729fc46a415ce5503a6"]},{_id:"5e4e74eb380054797d9db623",first_name:"Ricky",last_name:"bichel",timestamp:1606395689131}]
const user_id="5fbfa748fc46a415ce5503a8"

const {matching, nonMatching} = users.reduce((acc, userRecord) => {
  userRecord?.key?.includes(user_id)
  // or, if you need to compare by _id
  // userRecord._id === user_id
    ? acc.matching.push(userRecord)
    : acc.nonMatching.push(userRecord)
  return acc
}, {matching: [], nonMatching: []})

console.log(matching)