如果我知道其他属性,在数组中查找对象并更改其属性

时间:2016-08-10 12:02:35

标签: javascript arrays object

我有一个对象数组,我需要一个函数,通过对象属性(示例中为id)查找对象数组,并更改其他属性(示例中为name)。目前我的实现如下:

var arrayOfObjects = [{
    id: 1,
    name: 'Alpha'
}, {
    id: 2,
    name: 'Bravo'
}];

var setNameById = function (id, newName) {
    arrayOfObjects.filter(function(obj) {return obj.id === id;}).name = newName;
};

console.log(JSON.stringify(arrayOfObjects)); // initial array logged
setNameById(2, 'Charlie');
console.log(JSON.stringify(arrayOfObjects)); // initial array logged

我知道问题在于更改过滤器而不是初始对象返回的对象,但我没有找到在这种情况下可以访问初始对象的实现,是否可能或者我是否需要重新思考导致我达到这一点的步骤。

3 个答案:

答案 0 :(得分:2)

使用此代替过滤器。过滤产生新阵列。

arrayOfObjects.forEach(function(v){
  if (v.id == id) {v.name = newName}
});

答案 1 :(得分:1)

使用Array#forEach而不是Array#filter

请注意,=====应用于比较,=将分配值!

带有条件的

Array#forEach应该足以更新现有的对象数组。

var arrayOfObjects = [{
  id: 1,
  name: 'Alpha'
}, {
  id: 2,
  name: 'Bravo'
}];

var setNameById = function(id, newName) {
  var filtered = arrayOfObjects.filter(function(obj) {
    return obj.id == id;
  });
  filtered.forEach(function(el) {
    el.name = newName;
  });
  return filtered;
};

console.log(JSON.stringify(arrayOfObjects));
var filtered = setNameById(2, 'Charlie');
console.log(JSON.stringify(filtered));

使用Array#map

var arrayOfObjects = [{
  id: 1,
  name: 'Alpha'
}, {
  id: 2,
  name: 'Bravo'
}];

var setNameById = function(id, newName) {
  return arrayOfObjects.filter(function(obj) {
    return obj.id == id;
  }).map(function(el) {
    el.name = newName;
    return el;
  });
};

console.log(JSON.stringify(arrayOfObjects));
var filtered = setNameById(2, 'Charlie');
console.log(JSON.stringify(filtered));

答案 2 :(得分:0)

Filter返回一个数组。因此,必须在您的方法中使用index

你的方法



var arrayOfObjects = [{
  id: 1,
  name: 'Alpha'
}, {
  id: 2,
  name: 'Bravo'
}];

var setNameById = function(id, newName) {
  arrayOfObjects.filter(function(obj) {
    return obj.id = id;
  })[0].name = newName;
};

console.log(JSON.stringify(arrayOfObjects)); // initial array logged
setNameById(2, 'Charlie');
console.log(JSON.stringify(arrayOfObjects));




array.find

如果您确定只返回一个值,请使用array.find



var arrayOfObjects = [{
  id: 1,
  name: 'Alpha'
}, {
  id: 2,
  name: 'Bravo'
}];

var setNameById = function(id, newName) {
  arrayOfObjects.find(function(obj) {
    return obj.id = id;
  }).name = newName;
};

console.log(JSON.stringify(arrayOfObjects)); // initial array logged
setNameById(2, 'Charlie');
console.log(JSON.stringify(arrayOfObjects));




array.forEach

如果有多个对象具有相同的搜索关键字(在本例中为id),请使用array.forEach代替array.filter,然后循环使用已过滤的数组



var arrayOfObjects = [{
  id: 1,
  name: 'Alpha'
}, {
  id: 2,
  name: 'Bravo'
}];

var setNameById = function(id, newName) {
  arrayOfObjects.forEach(function(obj) {
    if(obj.id = id) obj.name = newName;
  });
};

console.log(JSON.stringify(arrayOfObjects)); // initial array logged
setNameById(2, 'Charlie');
console.log(JSON.stringify(arrayOfObjects));