JavaScript:如何在迭代过程中修改数组中的值?

JavaScript:如何在迭代过程中修改数组中的值?,javascript,arrays,node.js,Javascript,Arrays,Node.js,嗨,新手问题 var aarr = [ { "label": "Name", "visible": true, "value": "HOW" }, { "label": "Age", "visible": false, "value": "23" }, { "label": "goodToGo", "visible": false, "value": "Yes" }, { "label": "authe

嗨,新手问题

var aarr = [
 {
    "label": "Name",
    "visible": true,
    "value": "HOW"
 },
 {
    "label": "Age",
    "visible": false,
    "value": "23"
 },
 {
    "label": "goodToGo",
    "visible": false,
    "value": "Yes"
 },
 {
    "label": "authenticatedflag",
    "visible": true,
    "value": "No"
 }
];
场景:(如何在单循环中实现此逻辑)

需要根据此条件修改上述数组:

例如:如果label==“Name”&&“value”==“HOW”,则将Age.value修改为 “27”和authenticatedflag.value为“否”,在同一循环中, label==“Age”&&“value”==“27”然后,将goodogo.value修改为 否,并将authenticatedflag.value设置为“是”

代码的一部分将被删除

aarr.map(aObj => {
    if(aObj.label === "Name" && aObj.value === "HOW") {
        // In this case i need to modify the aarr contents
    }
    // Before this loop executes the aarr contents should be changed.
    if(aObj.label === "Age" && aObj.value === "27") {
        // Once again modify the contents of the array before passing to next condition
    }
});
@Tushar的第2条评论似乎起了一半作用

if (arr.find(o => o.label === 'Name' && o.value === 'HOW')) {
    arr.find(o => o.label === 'Age').value = 27;
    arr.find(o => o.label === 'authenticatedflag').value = 'No';
} else if (arr.find(o => o.label === 'Age' && o.value === '27')) {
    arr.find(o => o.label === 'goodToGo').value = 'No';
    arr.find(o => o.label === 'authenticatedflag').value = 'Yes';
}

console.log(arr);

/*
[ { label: 'Name', visible: true, value: 'HOW' },
  { label: 'Age', visible: false, value: 27 },
  { label: 'goodToGo', visible: false, value: 'Yes' },
  { label: 'authenticatedflag', visible: true, value: 'No' } ]
*/
在这种情况下,只有一个条件得到满足,实际上它需要同时满足这两个条件

var arr = [{
    "label": "Name",
    "visible": true,
    "value": "HOW"
}, {
    "label": "Age",
    "visible": false,
    "value": "23"
}, {
    "label": "goodToGo",
    "visible": false,
    "value": "Yes"
}, {
    "label": "authenticatedflag",
    "visible": true,
    "value": "No"
}];

/* if (arr.find(o => o.label === 'Name' && o.value === 'HOW')) {
    arr.find(o => o.label === 'Age').value = 27;
    arr.find(o => o.label === 'authenticatedflag').value = 'No';
} 

if (arr.find(o => o.label === 'Age' && o.value === '27')) {
    arr.find(o => o.label === 'goodToGo').value = 'No';
    arr.find(o => o.label === 'authenticatedflag').value = 'Yes';
}

console.log(arr); */

/*
[ { label: 'Name', visible: true, value: 'HOW' },
  { label: 'Age', visible: false, value: 27 },
  { label: 'goodToGo', visible: false, value: 'Yes' },
  { label: 'authenticatedflag', visible: true, value: 'No' } ]
*/

var a = arr.map(aObj => {
    if(aObj.label === "Name" && aObj.value === "HOW") {
        arr.find(o => o.label === "Age").value = '27';
        arr.find(o => o.label === "authenticatedflag").value = 'No';
    }
    if(aObj.label === "Age" && aObj.value === '27') {
        arr.find(o => o.label === 'goodToGo').value = 'No';
        arr.find(o => o.label === 'authenticatedflag').value = 'Yes';
    }
    return aObj;
});

/*

[ { label: 'Name', visible: true, value: 'HOW' },
  { label: 'Age', visible: false, value: '27' },
  { label: 'goodToGo', visible: false, value: 'No' },
  { label: 'authenticatedflag', visible: true, value: 'Yes' } ]

*/

这似乎符合我的条件。但这是唯一的办法吗?或者有什么好方法可以修改这些值吗?

我会将数组的结构(如果可能)修改为更合适的:

var obj = {
    "Name": {
        "visible": true,
        "value": "HOW"
    },
    "Age": {
        "visible": false,
        "value": "23"

    },
    "goodToGo": {
        "visible": false,
        "value": "Yes"

    },
    "authenticatedflag": {
        "visible": true,
        "value": "No"

    }
}
这将帮助您执行以下操作:

if (obj.Name.value === 'HOW') {
    obj.Age.value = 27;
    obj.authenticatedFlag.value = 'No';
}

if (obj.Age.value === 27) {
    obj.goodToGo.value = 'No';
    obj.authenticatedFlag.value = 'Yes';
}
甚至更多

如果无法修改结构本身,我仍会尝试转换数组本身:

这将把您的数组转换为我建议的结构(以防您无法更改服务器的响应)


乐:我现在看到你在使用ES2015(我很高兴你这么做:))。这里有一个更新的提琴:

map
将用您返回的任何内容替换当前迭代中的值,因此只需修改
aObj
,然后返回它。
if(arr.find(o=>o.label=='Name'&&o.value=='HOW'){arr.find(o=>o.label==''Age')。value=27;arr.find(o=>o.label=='authenticatedflag').value='No';}else如果(arr.find(o=>o.label=='Age'和&o.value==''27'){arr.find(o=>o.label=='=''goodogo')。value='No';arr.find(o=>o.label==''authenticatedflag')。value='Yes'}
感谢Marty和Tushar,if将研究这两个建议。以及@Marty如何在使用map时修改同一数组中的两个值,当条件满足时,我需要在同一数组中的另一个map?Oops太新手了,我想有人浪费了2分来否决我的问题:)。无论如何,在我看来,这是个新手问题。@Marty说地图“替换”是误导。它从返回的值创建一个新数组,它不会就地修改数组(虽然它可以用于此,但forEach更合适)。感谢您的回答,让我分析并检查它。
var arr = [
    {
        "label": "Name",
        "visible": true,
        "value": "HOW"
    }, {
        "label": "Age",
        "visible": false,
        "value": "23"
    }, {
        "label": "goodToGo",
        "visible": false,
        "value": "Yes"
    }, {
        "label": "authenticatedflag",
        "visible": true,
        "value": "No"
    },
];

var res = arr.map(function (item) {
    var result = {};
    result[item.label] = {
        visible: item.visible,
        value: item.value
    };
    return result;
}).reduce(function (acc, it) {
    return Object.assign(acc, it);
});