根据值

时间:2017-10-24 08:54:35

标签: javascript arrays reactjs

我必须更改数组中对象的属性值。该数组如下所示:

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;
});

问题是,这给了我一个对象的副本,而不是对象本身。

有没有办法以较短的方式修改正确对象的属性值?使用扩展运算符我可以确保我不改变整个数组/对象,但首先我需要知道如何更改值。

5 个答案:

答案 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进行迭代,然后更改对象:

&#13;
&#13;
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;
&#13;
&#13;