以下是我的主阵列:
var myArray = [
{field: 'Saab', flag: false},
{field: 'cStatus', flag: false},
{field: 'BMW', flag: false},
{field: 'Mercedes', flag: false}
];
var cars1 = ["Saab", "Bmw"];
我正在尝试将flag
对象的属性myArray
设置为true,其field
属性包含在cars1
变量中。
仅myArray
变量中的预期输出:
myArray = [
{field: 'Saab', flag: true},
{field: 'Volvo', flag: false},
{field: 'BMW', flag: true},
{field: 'Mercedes', flag: false}
];
有人可以告诉我该怎么做吗?我尝试过以下方法:
var myArray = [
{field: 'Saab', flag: false},
{field: 'Volvo', flag: false},
{field: 'BMW', flag: false},
{field: 'Mercedes', flag: false}
];
var cars1 = ["Saab", "BMW"];
console.log(myArray.filter(x => cars1.indexOf(x.field) > -1));

答案 0 :(得分:1)
如何解决问题的方法之一是使用Array#some
检查myArray
数组中是否存在cars1
中指定的元素。如果是 - 将flag
设置为true。
var myArray=[{field:"Saab",flag:false},{field:"cStatus",flag:false},{field:"BMW",flag:false},{field:"Mercedes",flag:false}],
cars1 = ["Saab", "BMW"];
myArray.forEach(v => cars1.some(c => c == v.field ? v.flag = true : null));
console.log(myArray);
答案 1 :(得分:1)
您可以使用Array.prototype.indexOf
和Array.prototype.forEach
来迭代数组并检查cars1
是否包含field
:
var myArray = [
{field: 'Saab', flag: false},
{field: 'Volvo', flag: false},
{field: 'BMW', flag: false},
{field: 'Mercedes', flag: false}
];
var cars1 = ["Saab", "BMW"];
myArray.forEach(car => car.flag = cars1.indexOf(car.field) > -1);
console.log(myArray);
以上迭代数组,car
表示当前对象。然后我们将car.flag
分配给cars1.indexOf(car.field) > -1
的结果。如果cars1
包含该字段,则结果为true;如果不包含该字段,则结果为false。
您也可以使用Array.prototype.includes
检查数组是否包含某个值,但并非所有浏览器都支持(大多数情况下都支持)。这将取消indexOf
检查:
var myArray = [
{field: 'Saab', flag: false},
{field: 'Volvo', flag: false},
{field: 'BMW', flag: false},
{field: 'Mercedes', flag: false}
];
var cars1 = ["Saab", "BMW"];
myArray.forEach(car => car.flag = cars1.includes(car.field));
console.log(myArray);
答案 2 :(得分:1)
嘿学习你可以使用forEach方法遍历你的myArray'然后在cars1上使用.find方法进行数组的每次迭代。如果cars1.find,找到一个等于当前cars字段,那么它会将value.flag设置为true。如果没有,则将其设置为false。
这是指向的链接 .find()方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
我希望这有帮助!
var myArray = [
{field: 'Saab', flag: false},
{field: 'Volvo', flag: false},
{field: 'BMW', flag: false},
{field: 'Mercedes', flag: false}
];
var cars1 = ["Saab", "BMW"];
myArray.forEach(value => {
cars1.find((v) => v === value.field) ? value.flag = true : value.flag = false;
})
答案 3 :(得分:1)
您可以将Set
用于汽车,然后仅迭代myArray
。
关键部分是一个回调,它使用内容为cars1
的集合上的闭包
myArray.forEach(
(cars => o => cars.has(o.field) && (o.flag = true))(new Set(cars1))
);
基本上是第一步
(cars => o => cars.has(o.field) && (o.flag = true))(new Set(cars1))
(cars => )(new Set(cars1))
// ^^^^ closure over
// ^^^^^^^^^^^^^^ set with car values
如果field
位于集合中,则会在返回的函数内部进行检查,然后将true
分配给o.flag
。
o => cars.has(o.field) && (o.flag = true)
// ^ currentValue of array
// ^^^^^^^^^^^^^^^^^ check if field is in set
// ^^ if true
// ^^^^^^^^^^^^^^^ evaluate expression
// assign true to o.flag
var myArray = [{ field: 'Saab', flag: false }, { field: 'cStatus', flag: false }, { field: 'BMW', flag: false }, { field: 'Mercedes', flag: false }],
cars1 = ["Saab", "Bmw"];
myArray.forEach((cars => o => cars.has(o.field) && (o.flag = true))(new Set(cars1)));
console.log(myArray);