2014-02-28 8 views
0

배열에 대한 일련의 논리 테스트를 실행하려고합니다. 각 배열은 1 개의 ID 번호와 1 개의 항목을 포함합니다. 다음을 확인해야합니다 : ID 번호 1이 배열에 나타나면 신발 또는 양말 (신발 또는 양말 이외의 다른 것은 false)을 포함해야하며 그 중 적어도 하나는 [1, sock] 및 [1, 구두]. ID 1은 발생하지 않아도되며, 나중에 발생하면 ID 1이 적용됩니다. 마찬가지로 ID 2에 대한 조건도 같습니다. 필자는 함수에 무엇을 찾을 지 알려주는 객체 배열 (내 함수의 var f)을 제공하려고했습니다. 내 논리는 여기에 배열에 단 하나의 객체가 있다면 잘 작동하지만, 한번 더 추가하면 실패합니다.Javascript가 배열을 반복하고 논리 문을 확인합니다.

항목 배열을 병합하는 것이 잘못 될 것이라고 생각합니다. 이 같은 것을 할 수있는 좋은 방법이 있을까요? test_data는 [1 '양말', '신발'], [1] 인 경우

var _ = require('lodash'); 

function d(msg) { 
    console.log(msg); 
} 


var test_data = [[1,'shoe'],[1,'sock'], [2, 'apple'], [2, 'pear']]; 

function checker(array){ 
    var f = [{id_num: 1, item: ['shoe', 'sock']}, {id_num: 2, item: ['apple', 'pear']}]; 

    var mm = true; 
    var inLine; 

    var valids = function(obj){ 
     vlist = []; 
     _.forEach(obj, function(item){ 
      vlist.push(item.item); 
     }); 
     return _.flatten(vlist); 
    }; 

    _.forEach(f, function(obj){ 
     _.forEach(obj.item, function(zone){ 
      inLine = false; 
      _.forEach(t, function(line){ 
       if(_.contains(valids(f), line[1])){ 
        if(_.contains(line, obj.id_num) && _.contains(line, zone)){ 
         inLine = true; 
        } 
       } else { inLine = false; } 
      }); 
      mm = mm && inLine; 
     }); 
    }); 
    d(mm); 
} 

checker(test_data); 

예상되는 결과의 예는

것이다. 예상 결과는 2가 발생했기 때문에 참이어야합니다. 값이 나타나는 경우 테스트는 ... 적용이의

답변

0

내 버전 :

var f = [{id_num: 1, item: ['shoe', 'sock']}, {id_num: 2, item: ['apple', 'pear']}]; 

//Reduces our schema to an object using the IDs as keys 
var f_new = f.reduce(function(sofar, curr){ sofar[curr.id_num] = curr.item; return sofar},{}) 


//Helper. Checks if the item is permitted 
function valid(item){ 
     var possible_items = f_new[item[0]+""] 
     return _.contains(possible_items, item[1]) 
} 


//Reduces the test data to the same format that f_new 
function test_data_occurences (test_data) { 
    return test_data.reduce(function(sofar, curr){  
     if(!valid(curr)){throw "Invalid item "+curr} 

     var items = sofar[curr[0]] 
     if(items===undefined){ 
      sofar[curr[0]] = [curr[1]] 
     }else{ 
      items.push(curr[1]) 
     } 
     return sofar 
    },{}) 
} 

//Does the actual work 
function array_valid(array){ 
    try{ 
     var array_occurences = test_data_occurences(array) 
     //Loops through each ID 
      _.each(array_occurences, function(values,id){ 
       //Gets the possible values 
       var possible_values = f_new[id] 
       //Checks if all possible values are contained as actual values 
       var contains_all = _.all(possible_values, function(val){return _.contains(values,val)}) 
       if(!contains_all)throw("Not all values are contained for ID "+id) 
      }) 
     } 
    catch(err){ 
     console.log(error) 
     return false 
    } 
    return true 
} 


array_valid([[1,'shoe'],[1,'sock'], [2, 'apple'], [2, 'pear']]) 

array_valid([[1,'shoe'], [2, 'apple'], [2, 'pear']]) 
//Not all values are contained for ID 1 

array_valid([[1,'shoes'],[1,'sock'], [2, 'apple'], [2, 'pear']]) 
//Invalid item 1,shoes