2015-12-28 3 views
0

У меня есть массив объектов users:изменение одного значения в массиве объектов

let state = { 
    users: [ 
    {id: 1, name: 'Igor', selected: false}, 
    {id: 2, name: 'Anton', selected: false}, 
    {id: 3, name: 'Vasya', selected: false}, 
    {id: 4, name: 'Pete', selected: false}, 
    {id: 5, name: 'Dan', selected: false} 
    ], .... 

и функция, которая работает с этим объектом:

export function selectUser(userId) { 
    if (state.users.find(item => item.id == userId).selected == false) { 
    /* some code */ 

    //[needed] Code to update the user property selected to true 

    } else { 
    /* some other code */ 

    //[needed] Code to update the user property selected to true 
    } 
    emitChange(); 
} 

Как сделать это, не переписывая весь массив , странно ничего не думать

+3

Пожалуйста маркировать с используемым языком. Это похоже на JavaScript, но опять же Pepsi выглядит как Coke, но я бы никогда не захотел выпить Pepsi. –

+1

«Как это сделать», как это сделать __what__? –

+0

, когда вы говорите, что вы хотите изменить или изменить существующий объект? – Bek

ответ

1

, если вы хотите, чтобы переключить свойство затем

export function selectUser(userId) { 
    var user = state.users.find(user => user.id == userId); 
    var isSelected = user.selected; 
    // state.users.forEach(user => user.selected = false); deselect others 
    user.selected = !isSelected; 
    emitChange(); 
} 
1

Метод find() возвращает объект, который вы хотите обновить. Поэтому сначала вызовите это и назначьте его переменной, затем проверьте, существует ли она, и если да, то с ней работать.

export function selectUser(userId) { 
    var user = state.users.find(item => item.id == userId); 

    if (user != 'undefined'){ 
    if (user.selected == false) { 
     /* some code */ 

     user.name = 'New Name'; 
     // etc 

    } else { 
     /* some other code */ 
    } 
    } 

    emitChange(); 
} 
1

Согласно комментариям в истинном и ложном случае это должно работать:

export function selectUser(userId) { 
    var user = state.users.find(item => item.id == userId); 
    if (user && user.selected == false) { 
    user.selected = true; 
    } else { 
    /* some other code */ 
    } 
    emitChange(); 
} 
+0

find() возвращает новый объект, поэтому вы изменяете «пользователь» в своем коде, а не в исходном объекте –

+0

@ikffs Откуда вы получили эту информацию? Согласно спецификациям Array.find() возвращает сам объект, а не копию или что-то в этом роде. Я также тестировал его, и он работает. – ViRuSTriNiTy

+1

jeez buddy, вы спасатель, извините за длинный ответ, я не знаю почему, но я действительно думал, что поиск возвращает какой-то другой объект, глупый меня! благодаря –

Смежные вопросы