2017-03-03 77 views
0

在這裏,我想比較Cars1記錄與myArray記錄,如果他們匹配我想設置選擇屬性爲真的MyArray匹配記錄。比較2包含逗號分隔值的數組記錄

myArray的Abc.mp3,lmn.mp3,ggg.mp3與cars1的Abc.mp3,lmn.mp3匹配,因爲Abc.mp3在兩個數組中都是匹配的。

這裏Abc.mp3,lmn.mp3,ggg.mp3 3個不同的記錄,以便通過逗號分割如果任何的字符串中cars1是匹配(由逗號分割),則 設定標誌後爲true。

預期輸出:

var myArray = [ 
    {field: 'Abc.mp3,lmn.mp3,ggg.mp3', flag: true}, //Abc.mp3 is matching 
    {field: 'kkk.mp3', flag: false}, 
    {field: 'Xyz.mp3', flag: true}, //Xyz.mp3 is matching 
    {field: 'MMM.mp3,UUU.mp3', flag: true}, //UUU.mp3 is matching 
]; 

var myArray = [ 
 
    {field: 'Abc.mp3,lmn.mp3,ggg.mp3', flag: false}, 
 
    {field: 'kkk.mp3', flag: false}, 
 
    {field: 'Xyz.mp3', flag: false}, 
 
    {field: 'MMM.mp3,UUU.mp3', flag: false}, 
 
]; 
 

 
var cars1 = ["Abc.mp3,lmn.mp3", "Xyz.mp3","UUU.mp3"]; 
 

 
var cars2 = ["S1","S2","S3" ]; 
 

 
var array2 =[]; 
 

 
var map = Object.create(null); 
 
cars1.forEach(function (entry, index) { 
 
     map[entry] = index; 
 
    }); 
 
array2 = myArray.map(function (item) { 
 
     var index = map[item.field]; 
 
     if (index === undefined) { 
 
       return undefined; 
 
     } 
 
     item.flag = true; 
 
     return cars2[index]; 
 
}); 
 
console.log(myArray);

更新: 現在cars1和cars2記錄有1到1彼此,這意味着Abc.mp3,LMN關係汽車1的.mp3分別指向汽車2的S1。

同時匹配myArray的與Cars1如果匹配,那麼找到我要指出的cars1的指數,基於該指數我想從cars2獲取記錄,並指定在該索引位置數組2。

對於例如:abc.mp3,lmn.mp3,myArray和Abc.mp3的ggg.mp3,cars1的lmn.mp3匹配,所以Abc.mp3的索引,lmn.mp3爲0,因此基於此索引得到從第0 cars2索引記錄並分配在第0 index.for Xyz.mp3 S2到ARRAY2將在數組2第二位置。

預計在輸出數組2:

array2 = ["S1" ,undefined, "S2","S3" ]; 
+1

請澄清你的問題。使用** BOLD **和_Italic_對重要部分進行格式化 –

+0

這個問題很難跟蹤,而且不清楚你的實際問題是什麼。所以,你需要經過'myArray',如果任何逗號分隔的中值'field'匹配任何逗號分隔值是'cars1'然後設置'flag'到TRUE;,是這樣嗎?那我們可以擺脫無關緊要的'cars2'嗎?你是否需要'array2',因爲無論如何你都在改變原始的(或者不是那個意圖?)。 –

+0

@MattBurland:你對第一點是正確的,cars2和array2是重​​要的。請參閱我的更新,其中我已經解釋了 –

回答

1

所以,你想是這樣的,我認爲:

function match(data, selectors) { 
 
    return selectors.map(function(selector) { 
 
    let matchedIndex = -1; 
 
    return Object.assign({}, selector, { 
 
     flag: data.some(function(item, index) { 
 
     return selector.field.split(',').some(function(s) { 
 
      if(item.split(',').indexOf(s) > -1) { 
 
      matchedIndex = index; 
 
      return true; 
 
      } 
 
      return false; 
 
     }); 
 
     }), 
 
     matchedIndex: matchedIndex 
 
    }); 
 
    }); 
 
} 
 

 

 

 
var myArray = [ 
 
    {field: 'Abc.mp3,lmn.mp3,ggg.mp3', flag: false}, 
 
    {field: 'kkk.mp3', flag: false}, 
 
    {field: 'Xyz.mp3', flag: false}, 
 
    {field: 'MMM.mp3,UUU.mp3', flag: false}, 
 
]; 
 
var cars = ["Abc.mp3,lmn.mp3", "Xyz.mp3","UUU.mp3"]; 
 
var cars2 = ["S1", "S2", "S3"]; 
 

 
var matched = match(cars, myArray); 
 
var matchedFields = matched.filter(function(item) { return item.flag }); 
 

 

 

 
console.log(matched); 
 
console.log(matchedFields); 
 

 
var matchedCars2 = matched.map(function(item) { return cars2[item.matchedIndex]}); 
 
console.log('matched cars 2', matchedCars2);

+0

Upvoted爲您提供的幫助我的努力。我已更新我的問題以包含array2的詳細信息。你能否更新你的答案,以便爲array2合併期望的輸出 –

+1

我已經更新了片段 – cyrix

+0

有沒有使用matchedFields? –

1

您正在尋找這樣的事情?

var myArray = [ 
 
    {field: 'Abc.mp3,lmn.mp3,ggg.mp3', flag: false}, 
 
    {field: 'kkk.mp3', flag: false}, 
 
    {field: 'Xyz.mp3', flag: false}, 
 
    {field: 'MMM.mp3,UUU.mp3', flag: false}, 
 
]; 
 

 
var cars1 = ["Abc.mp3,lmn.mp3", "Xyz.mp3","UUU.mp3"]; 
 

 
var carsHash = cars1.reduce(function(p,c) { 
 
    var split = c.split(","); 
 
    split.forEach(function(i) { p[i] = true; }); 
 
    return p; 
 
},{}); 
 

 
myArray.forEach(function(i) { 
 
    var split = i.field.split(","); 
 
    i.flag = split.some(function(v) { return carsHash[v]; }); 
 
}); 
 

 
console.log(myArray);

首先我們創建一個哈希將全部從cars1子字符串。然後,我們剛剛經歷myArray,如果任何field子串迴路存在於carsHash我們設置i.flag爲true。