2017-02-28 55 views
0

下面是我的主阵列:的属性设置值,如果值是数组

var myArray = [ 
    {field: 'Saab', flag: false}, 
    {field: 'cStatus', flag: false}, 
    {field: 'BMW', flag: false}, 
    {field: 'Mercedes', flag: false} 
]; 

var cars1 = ["Saab", "Bmw"]; 

我试图设置属性flagmyArray对象,其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));

回答

1

可以利用Array.prototype.indexOfArray.prototype.forEach迭代阵列上方,并检查是否包含cars1field

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

在第上述迭代e数组和car表示当前对象。然后我们将car.flag分配给cars1.indexOf(car.field) > -1的结果。如果cars1包含该字段,则结果为真;如果不包含,则结果为真。

您也可以使用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);

+0

这工作。非常感谢你对我的帮助,并请继续帮助像这样:) :) –

+0

根据你在哪个浏览器中包含dostst的工作? –

+0

@学习Internet Explorer目前不支持它,但所有其他主流浏览器都支持。 – Li357

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

+0

我很好奇,是'some'这里需要的?这似乎有点过分复杂。 – Li357

+0

@AndrewLi这只是解决问题的方法之一。而且我很喜欢它。 –

+0

非常感谢你的回答和你对我的帮助,并请继续帮助我:) –

1

嘿学习,你可以通过你的“myarray的”使用forEach方法循环,​​然后通过使用.find方法上cars1每次迭代你的数组。如果cars1.find找到等于当前汽车字段的值,那么它会将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; 
}) 
+0

嘿安德鲁谢谢你的反馈。我用你提供的代码片段运行代码,但它不起作用。你有什么想法? –

+0

适合我:https://jsfiddle.net/uq31s8fv/ - 你也可以摆脱括号,因为他们是redudant。我在我的评论中犯了一个错误,我的意思是'value.flag'而不是'v.flag'。哎呦 – Li357

+0

非常感谢你的回答和解释,以及你对我的帮助,并请继续帮助这样的努力:) –

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在该组中,则发生trueo.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);

+0

Upvoted为您的慈善努力,帮助我可以请你解释我这一行:cars = > o => cars.has(o.field)&&(o.flag = true))(new Set(cars1)) –

+1

@学习,也许编辑会有所帮助。 –

+0

非常感谢你的回答和解释,以及你对我的帮助,请继续帮助我:) –