0

I have an changing array with selected items, where key is id:

[1, 2, 4, 6]

And array of objects:

items = [
  {
    id: 1,
    selected: false
  },
  {
    id: 2,
    selected: false
  },
  {
    id: 3,
    selected: false
  },
  {
    id: 4,
    selected: false
  },
  {
    id: 5,
    selected: true
  },
  {
    id: 6,
    selected: false
  }
]

How can I map selected array to items and change 'selected' to true and for other items change it to false?

1
  • There are a variety of ways you can accomplish this, however could you provide more details on your use case as there might be a better approach, then to simply iterating through all items and updating the value? For example you could change the items array to be a hashmap/object and to look similar to this: items: {1: {id: 1, selected: false}}, but it all depends Commented Dec 9, 2016 at 10:56

5 Answers 5

3
items.forEach(item => item.selected = array.contains(item.id))

Simply loop through items, setting the selected property based on whether or not the id is contained in the array.

Sign up to request clarification or add additional context in comments.

Comments

2
var items = [
  {
    id: 1,
    selected: false
  },
  {
    id: 2,
    selected: false
  },
  {
    id: 3,
    selected: false
  },
  {
    id: 4,
    selected: false
  },
  {
    id: 5,
    selected: true
  },
  {
    id: 6,
    selected: false
  }
];
var array = [1, 2, 4, 6];

items.forEach(function(item) {
  item.selected = (array.indexOf(item.id) !== -1);
})

Comments

1

You could use a Map and iterate the array and set all false, and then the selected to true.

var selected = [1, 2, 4, 6],
    items = [{ id: 1, selected: false }, { id: 2, selected: false }, { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: true }, { id: 6, selected: false }],
    map = new Map;

items.forEach(a => (map.set(a.id, a), a.selected = false));
selected.forEach(a => map.get(a).selected = true);

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

A version with Set.

var selected = [1, 2, 4, 6],
    items = [{ id: 1, selected: false }, { id: 2, selected: false }, { id: 3, selected: false }, { id: 4, selected: false }, { id: 5, selected: true }, { id: 6, selected: false }],
    set = new Set(selected);

items.forEach(a => a.selected = set.has(a.id));

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

1 Comment

It seems that selected changes, but items does not? In that case, the solution should build the map once from items, and then have a way to update items based on the new selected.
0
var arr = [1,2,4,6];
var items = [
  {
    id: 1,
    selected: false
  },
  {
    id: 2,
    selected: false
  },
  {
    id: 3,
    selected: false
  },
  {
    id: 4,
    selected: false
  },
  {
    id: 5,
    selected: true
  },
  {
    id: 6,
    selected: false
  }
];

var notSelected = $.grep(items, function(e) { return arr.indexOf(e.id) == -1 }).map(function(e) { e.selected = false; return e;});
var selected = $.grep(items, function(e) { return arr.indexOf(e.id) != -1 }).map(function(e) { e.selected = true; return e;});

Result:

notSelected.concat(selected);

1 Comment

usually better not to provide jQuery solutions unless requested.
-1

Please Try it. I think it will works...

$new=array();
foreach($items as $item){
   if($item['selected']==false){
$new.=array_merge($item['id']);
    }
}
print_r($new);

And to change non selected items true.

foreach($items as $item){
if($item['selected']==false){
$item['selected']=true;
 }
}

1 Comment

What language is this?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.