如果值在数组中,则设置属性值

时间:2017-02-28 17:23:19

标签: javascript arrays

以下是我的主阵列:

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




4 个答案:

答案 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.indexOfArray.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);