最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Get missing objects from 2 arrays of objects - Stack Overflow

programmeradmin4浏览0评论
let selected = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'}
];

let all = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'},
  {id: 32, name: 'United States'},
  {id: 40, name: 'China'}
]

How do I get non-selected countries from all objects and print it out in another variable? Based on id key of those which are in selected array?

let selected = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'}
];

let all = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'},
  {id: 32, name: 'United States'},
  {id: 40, name: 'China'}
]

How do I get non-selected countries from all objects and print it out in another variable? Based on id key of those which are in selected array?

Share Improve this question asked Feb 3, 2017 at 16:49 knitevisionknitevision 3,1736 gold badges32 silver badges44 bronze badges 1
  • 1 Caveat, remember that {id: 25, name: 'Germany'} !== {id: 25, name: 'Germany'}. – Jared Smith Commented Feb 3, 2017 at 16:53
Add a ment  | 

3 Answers 3

Reset to default 5

You need to find all objects that aren't contained in selected and then do something with them:

let nonSelectedItems = all.filter(obj => selected.every(s => s.id !== obj.id));

//do stuff with non-selected items

You can use filter and find, so as soon as element with same id is found in selected it will filter out that element from all. You can also use some instead of find.

let selected = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'}
];

let all = [
  {id: 15, name: 'Canada'},
  {id: 25, name: 'Germany'},
  {id: 32, name: 'United States'},
  {id: 40, name: 'China'}
]

var r = all.filter(e => !selected.find(a => e.id === a.id));
console.log(r)

Generate an object which holds id as a property using Array#reduce method(which helps to speed up since you need to iterate over and over) and use Array#filter method to filter elements from all array.

// generate the object reference
let ref = selected.reduce(function(obj, o) {
  // define property
  obj[o.id] = true;
  // return object property
  return obj;
  // set initial value as an object
}, {});

// filter out array elements
let res = all.filter(function(o) {
  return !ref[o.id]
})

let selected = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}];

let all = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}, {
  id: 32,
  name: 'United States'
}, {
  id: 40,
  name: 'China'
}]

let ref = selected.reduce(function(obj, o) {
  obj[o.id] = true;
  return obj;
}, {});

console.log(
  all.filter(function(o) {
    return !ref[o.id]
  })
)


With ES6 arrow function :

let ref = selected.reduce((obj, o) => (obj[o.id] = true, obj), {});

let res = all.filter(o => !ref[o.id]);

let selected = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}];

let all = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}, {
  id: 32,
  name: 'United States'
}, {
  id: 40,
  name: 'China'
}]

let ref = selected.reduce((obj, o) => (obj[o.id] = true, obj), {});

console.log(
  all.filter(o => !ref[o.id])
)

发布评论

评论列表(0)

  1. 暂无评论