2017-02-22 28 views
1

У меня есть массив объектов person, и я хочу обновить один из объектов на месте.Javascript Обновить объект массива по атрибуту объекта

persons: [{ 
    id: '1', 
    name: 'John', 
    age: 12 
    }, { 
    id: '2', 
    name: 'Tom', 
    age: 13 
    }, { 
    id: '3', 
    name: 'David', 
    age: 14 
}] 

Функция у меня есть:

function updatePersonsWith(id, propName, value) { 
    this.persons.??? 
} 

Аргументы, передаваемые в id человека я хочу обновить, propName это свойство person объекта, может быть id, name или age, value это значение, которое я хочу заменить.

Я хочу найти объект по его id и обновить только этот объект массива.

updatePersonsWith(2, age, 16) 

Результат будет выглядеть так:

persons: [{ 
    id: '1', 
    name: 'John', 
    age: 12 
    }, { 
    id: '2', 
    name: 'Tom', 
    age: 16 
    }, { 
    id: '3', 
    name: 'David', 
    age: 14 
}] 

Может быть ES6 или с помощью lodash.

+0

Возможного дубликат [Как я могу обновить строку в яваскрипте массива на основе значения ключа?] (Http://stackoverflow.com/ вопросы/16148150/как-кан-я-обновление-ряд-в-JavaScript-массив на основе-на-ключ-значение) – RaR

ответ

4

Try:

let person = this.persons.find((person) => { 
    return person.id === id; 
}); 

if (person && person[propName]) { 
person[propName] = value; 
} 

Рабочий пример:

var persons = [{ 
 
    id: '1', 
 
    name: 'John', 
 
    age: 12 
 
    }, { 
 
    id: '2', 
 
    name: 'Tom', 
 
    age: 13 
 
    }, { 
 
    id: '3', 
 
    name: 'David', 
 
    age: 14 
 
}]; 
 

 
function update(id, prop, val) { 
 
\t var person = persons.find(function(p) { 
 
    \t return p.id === id; 
 
    }); 
 
    
 
    if (person && person[prop]) { 
 
    \t person[prop] = val; 
 
    } 
 
} 
 

 
update('1', 'age', 77); 
 

 
console.log(persons[0].age);

3

Вы можете использовать это:

let persons = [{ 
 
    id: '1', 
 
    name: 'John', 
 
    age: 12 
 
    }, { 
 
    id: '2', 
 
    name: 'Tom', 
 
    age: 13 
 
    }, { 
 
    id: '3', 
 
    name: 'David', 
 
    age: 14 
 
}]; 
 

 

 
function updatePersonsWith(id, propName, value) { 
 
    let item = persons.find((v) => { 
 
     return v.id == id; 
 
    }); 
 
    if (item && item.hasOwnProperty(propName)) { 
 
     item[propName] = value; 
 
    } 
 
}; 
 

 
updatePersonsWith(2, 'age', 16); 
 
console.log(persons)

1

Использование lodash, вы можете сделать, как,

function updatePersonsWith(id, propName, value) { 
    var match = _.find(persons , function(person) { return person.id === id }); 
    if(match) 
     match[propName] = value; 
}