Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS/TS如何迭代对象数组并更改值_Javascript_Arrays_Typescript_Object - Fatal编程技术网

Javascript JS/TS如何迭代对象数组并更改值

Javascript JS/TS如何迭代对象数组并更改值,javascript,arrays,typescript,object,Javascript,Arrays,Typescript,Object,考虑以下数组 routingButtonsHighlighter = [ {vehicle: true}, {userAssignment: false}, {relations: false} ]; 构建能够实现以下目标的函数的最佳方法是什么 1) 将所有成员设置为false 2) 将selected member设置为true(作为参数传递)您可以使用迭代数组,使用获取键,与所选键进行比较,并相应地设置值: const routingButtonsHighlighter=[{

考虑以下数组

routingButtonsHighlighter = [
  {vehicle: true},
  {userAssignment: false},
  {relations: false}
];
构建能够实现以下目标的函数的最佳方法是什么

1) 将所有成员设置为false
2) 将selected member设置为true(作为参数传递)

您可以使用迭代数组,使用获取键,与所选键进行比较,并相应地设置值:

const routingButtonsHighlighter=[{vehicle:true},{userAssignment:false},{relations:false}];
常量选择=(arr,selectedKey)=>
arr.forEach((o)=>{
const key=Object.keys(o)[0];
o[key]=key==selectedKey;
});
选择(routingButtonsHighlighter,“用户分配”);

控制台日志(路由按钮高亮显示)您可以使用迭代数组,使用获取密钥,与所选密钥进行比较,并相应地设置值:

const routingButtonsHighlighter=[{vehicle:true},{userAssignment:false},{relations:false}];
常量选择=(arr,selectedKey)=>
arr.forEach((o)=>{
const key=Object.keys(o)[0];
o[key]=key==selectedKey;
});
选择(routingButtonsHighlighter,“用户分配”);

控制台日志(路由按钮高亮显示)如果没有更具体的要求,这有点像选择自己的冒险

(注意:为简洁起见,此代码使用ES6和ES2018,所有这些都可以通过TypeScript传输。)

如果每个对象只有一个关键点
  • …您希望对原始数组和对象进行变异
const objects=[{vehicle:true},{userAssignment:false},{relations:false}];
功能选择键(对象,选择键){
for(让对象的obj){
常量[键]=对象键(obj);
obj[key]=key==selectedKey;
}
归还物品;
}
选择键(对象,“用户分配”);

console.log(对象)如果没有更具体的要求,这有点像选择自己的冒险

(注意:为简洁起见,此代码使用ES6和ES2018,所有这些都可以通过TypeScript传输。)

如果每个对象只有一个关键点
  • …您希望对原始数组和对象进行变异
const objects=[{vehicle:true},{userAssignment:false},{relations:false}];
功能选择键(对象,选择键){
for(让对象的obj){
常量[键]=对象键(obj);
obj[key]=key==selectedKey;
}
归还物品;
}
选择键(对象,“用户分配”);

console.log(对象)为类似的内容创建一个方法将是高度专业化的,因此为了抽象它,我决定这样编写:

function arrayFlagSinglePropertyTrue(key, arrayofobjects) {

    for (let i in arrayofobjects) {

        let keys = Object.keys(arrayofobjects[i]);
        if (keys[0] == key) {
            arrayofobjects[i][keys[0]] = true;
        } else {
            arrayofobjects[i][keys[0]] = false;
        }

    }

    return arrayofobjects;

}

routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];

console.log(arrayFlagSinglePropertyTrue("relations", routingButtonsHighlighter));
routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];
尽管这将满足您的要求,但它非常专业化,并且仅当数组中的对象包含一个属性,或者至少对象本身的第一个属性是您要设置为标志的属性时才有效


编辑:一些建议:

列表的一致性有助于避免您遇到的问题。通过使用统一的属性名构造对象,然后对值本身进行操作,您不再需要使用专门的函数或代码来修改它。此时,您可以依靠基本编程逻辑来高效地更改属性

如果您从某个外部源获取列表,并且无法控制它,那么您可能需要自己重新组织它。如果你做不到,那么制作专门的函数/代码是你最后的选择

如果可能,采取如下措施:

function arrayFlagSinglePropertyTrue(key, arrayofobjects) {

    for (let i in arrayofobjects) {

        let keys = Object.keys(arrayofobjects[i]);
        if (keys[0] == key) {
            arrayofobjects[i][keys[0]] = true;
        } else {
            arrayofobjects[i][keys[0]] = false;
        }

    }

    return arrayofobjects;

}

routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];

console.log(arrayFlagSinglePropertyTrue("relations", routingButtonsHighlighter));
routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];
将其组织为实际对象属性一致的情况:

let betterStructureObject = [
    { propertyName: "vehicle", status: true },
    { propertyName: "userAssignment", status: false },
    { propertyName: "vehicle", status: false },
]
因此,您可以轻松地对其进行循环,而不必担心编写专门的代码

for (let i in betterStructureObject) {

    if (betterStructureObject[i].propertyName == "vehicle")
         betterStructureObject[i].status = true;

    else betterStructureObject[i].status = false;

}

为类似的东西创建一个方法是高度专业化的,所以为了抽象它,我决定这样写:

function arrayFlagSinglePropertyTrue(key, arrayofobjects) {

    for (let i in arrayofobjects) {

        let keys = Object.keys(arrayofobjects[i]);
        if (keys[0] == key) {
            arrayofobjects[i][keys[0]] = true;
        } else {
            arrayofobjects[i][keys[0]] = false;
        }

    }

    return arrayofobjects;

}

routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];

console.log(arrayFlagSinglePropertyTrue("relations", routingButtonsHighlighter));
routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];
尽管这将满足您的要求,但它非常专业化,并且仅当数组中的对象包含一个属性,或者至少对象本身的第一个属性是您要设置为标志的属性时才有效


编辑:一些建议:

列表的一致性有助于避免您遇到的问题。通过使用统一的属性名构造对象,然后对值本身进行操作,您不再需要使用专门的函数或代码来修改它。此时,您可以依靠基本编程逻辑来高效地更改属性

如果您从某个外部源获取列表,并且无法控制它,那么您可能需要自己重新组织它。如果你做不到,那么制作专门的函数/代码是你最后的选择

如果可能,采取如下措施:

function arrayFlagSinglePropertyTrue(key, arrayofobjects) {

    for (let i in arrayofobjects) {

        let keys = Object.keys(arrayofobjects[i]);
        if (keys[0] == key) {
            arrayofobjects[i][keys[0]] = true;
        } else {
            arrayofobjects[i][keys[0]] = false;
        }

    }

    return arrayofobjects;

}

routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];

console.log(arrayFlagSinglePropertyTrue("relations", routingButtonsHighlighter));
routingButtonsHighlighter = [
    {vehicle: true},
    {userAssignment: false},
    {relations: false}
];
将其组织为实际对象属性一致的情况:

let betterStructureObject = [
    { propertyName: "vehicle", status: true },
    { propertyName: "userAssignment", status: false },
    { propertyName: "vehicle", status: false },
]
因此,您可以轻松地对其进行循环,而不必担心编写专门的代码

for (let i in betterStructureObject) {

    if (betterStructureObject[i].propertyName == "vehicle")
         betterStructureObject[i].status = true;

    else betterStructureObject[i].status = false;

}

变量
routingButtonsHighlighter
是一个数组,其中包含单个对象。这写对了吗?这样,可以有多个具有相同键的对象,它们也将被设置为true。@马克,那里没有JSON。@安迪,你说得对。我已经看了太多的JSON,我会更新注释。如果对象的键是
车辆
用户分配
关系
,那不是更容易吗。更新它们的值将非常简单,就像
obj.vehicle=false
那么。数组中的每个对象是否都只有一个属性?可以有多个对象具有相同的属性吗?变量
routingbuttonhighlighter
是一个数组,其中包含单个对象。这写对了吗?这样,可以有多个具有相同键的对象,它们也将被设置为true。@马克,那里没有JSON。@安迪,你说得对。我已经看了太多的JSON了,我会更新注释。让对象具有
车辆
用户分配
关系不是更容易吗