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了,我会更新注释。让对象具有车辆
、用户分配
和关系不是更容易吗