2017-02-28 60 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

非常感謝你的回答和解釋,以及你對我的幫助,請繼續幫助我:) –