我必须更改数组中对象的属性值。该数组如下所示:
let myArrWithObjs = [
{ id: 1, selected: false },
{ id: 2, selected: false },
{ id: 3, selected: false }
];
我有一个看起来像这样的函数:
changeObjectVal = (id) => {
// here I need to first find the right object within the array
// and after that I should modify its aBoolean property to true
}
所以,在函数中我只知道id值。如果id参数的值为2
,我需要获取数组中的第二个对象(因为它的id
也是2)。之后,我需要更改其selected
属性的值。
我找到了这段代码:
var selectedChartItemObj = myArrWithObjs.filter(function(obj) {
return obj.id == id;
});
问题是,这给了我一个对象的副本,而不是对象本身。
有没有办法以较短的方式修改正确对象的属性值?使用扩展运算符我可以确保我不改变整个数组/对象,但首先我需要知道如何更改值。
答案 0 :(得分:3)
如果你不介意改变数组中的对象。这将有效
// Using Array.prototype.find to get the inner object
const obj = myArrayWithObjs.find(o => o.id === id);
// Set the selected value
obj.selected = true
如果你想避免变异:
// Get the index
const idx = myArrayWithObjs.findIndex(o => o.id === id);
const currObj = myArrayWithObjs[idx]
// New object with spread
const nextObj = {
...currObj,
selected: true
};
// New array with spread
const nextArray = [
...myArrayWithObjs.slice(0, idx),
nextObj,
...myArrayWithObjs.slice(idx + 1)
];
答案 1 :(得分:1)
您正在通过将其分配给另一个变量来创建它的副本。如果您只是在筛选数组的第一项中设置属性,它将正常工作。
如果您有许多具有相同ID的项目,则可以使用.each循环将每个项目设置为true。
let myArrWithObjs = [
{ id: 1, selected: false },
{ id: 2, selected: false },
{ id: 3, selected: false }
];
changeObjectVal = (id) => {
myArrWithObjs.filter(function(obj) {
return obj.id == id;
})[0].selected=true;
}
changeObjectVal(3);
console.log(myArrWithObjs);

答案 2 :(得分:1)
我建议您使用changeObjectVal
函数的简单实现:
changeObjectVal = (id) => {
// here I need to first find the right object within the array
// and after that I should modify its aBoolean property to true
for(obj of myArrWithObjs) {
if(id === obj.id) {
obj.selected = true;
break;
}
}
}
答案 3 :(得分:1)
找到对象后可以使用Object.assign
。此提案使用默认对象,但如果所有包含所需对象options("stringsAsFactors" = FALSE)
df1 <- read.table(text =
"date item
02/01/2017 A
09/01/2017 B
16/01/2017 C
02/01/2017 C",
header = TRUE)
df2 <- read.table(text =
"date1 date2 item
01/01/2017 03/01/2017 A
08/01/2017 10/01/2017 B
15/01/2017 17/01/2017 C",
header = TRUE)
library(sqldf)
sqldf("
SELECT df1.*, CASE WHEN df1.item = df2.item THEN 'yes' ELSE 'no' END AS prm
FROM df1
LEFT JOIN df2
ON df1.date BETWEEN df2.date1 AND df2.date2
AND df1.item = df2.item
")
date item prm
1 02/01/2017 A yes
2 09/01/2017 B yes
3 16/01/2017 C yes
4 02/01/2017 C no
的对象都存在,则可以省略该对象。
this
答案 4 :(得分:1)
您可以使用Array#forEach进行迭代,然后更改对象:
const myArrWithObjs = [
{ id: 1, selected: false },
{ id: 2, selected: false },
{ id: 3, selected: false }
];
myArrWithObjs.forEach((o) => o.id === 2 && (o.selected = true));
console.log(myArrWithObjs);
&#13;