arffToolkit.js
function separateMultiClassArffData(arffData, outputAttributes) {  
  if (!Array.isArray(outputAttributes) || outputAttributes.length === 0) {
    outputAttributes = [arffData.attributes[arffData.attributes.length - 1]];
  }
  
  outputAttributes.forEach((attribute) => {
    if (arffData.types[attribute].hasOwnProperty('oneof') && arffData.types[attribute].oneof.length > 2) {
      
      arffData.attributes.splice(arffData.attributes.indexOf(attribute), 1);
      outputAttributes.splice(arffData.attributes.indexOf(attribute), 1);
      
      arffData.types[attribute].oneof.forEach((oneofValue, oneofIndex) => {
        const newAttributeName = attribute + '__' + oneofValue;
        
        outputAttributes.push(newAttributeName);
        arffData.attributes.push(newAttributeName);
        
        arffData.types[newAttributeName] = {type: 'nominal', oneof: ['n', 'y']};
        
        arffData.data.forEach((entry) => {
          if (entry[attribute] == oneofIndex) {
            entry[newAttributeName] = 1;
          }
          else {
            entry[newAttributeName] = 0;
          }
        });
        
      });
      
    }
  });
  return outputAttributes;
}
function separateMultiClassArffData(arffData, outputAttributes) {  
  if (!Array.isArray(outputAttributes) || outputAttributes.length === 0) {
    outputAttributes = [arffData.attributes[arffData.attributes.length - 1]];
  }
  
  outputAttributes.forEach((attribute) => {
    if (arffData.types[attribute].hasOwnProperty('oneof') && arffData.types[attribute].oneof.length > 2) {
      
      arffData.attributes.splice(arffData.attributes.indexOf(attribute), 1);
      outputAttributes.splice(arffData.attributes.indexOf(attribute), 1);
      
      arffData.types[attribute].oneof.forEach((oneofValue, oneofIndex) => {
        const newAttributeName = attribute + '__' + oneofValue;
        
        outputAttributes.push(newAttributeName);
        arffData.attributes.push(newAttributeName);
        
        arffData.types[newAttributeName] = {type: 'nominal', oneof: ['n', 'y']};
        
        arffData.data.forEach((entry) => {
          if (entry[attribute] == oneofIndex) {
            entry[newAttributeName] = 1;
          }
          else {
            entry[newAttributeName] = 0;
          }
        });
        
      });
      
    }
  });
  return outputAttributes;
}
function separateMultiClassArffData ( arffData , outputAttributes ) { if ( ! Array . isArray ( outputAttributes ) || outputAttributes . length === 0 ) { outputAttributes = [ arffData . attributes [ arffData . attributes . length - 1 ] ] ; } outputAttributes . forEach ( ( attribute ) => { if ( arffData . types [ attribute ] . hasOwnProperty ( 'oneof' ) && arffData . types [ attribute ] . oneof . length > 2 ) { arffData . attributes . splice ( arffData . attributes . indexOf ( attribute ) , 1 ) ; outputAttributes . splice ( arffData . attributes . indexOf ( attribute ) , 1 ) ; arffData . types [ attribute ] . oneof . forEach ( ( oneofValue , oneofIndex ) => { const newAttributeName = attribute + '__' + oneofValue ; outputAttributes . push ( newAttributeName ) ; arffData . attributes . push ( newAttributeName ) ; arffData . types [ newAttributeName ] = { type : 'nominal' , oneof : [ 'n' , 'y' ] } ; arffData . data . forEach ( ( entry ) => { if ( entry [ attribute ] == oneofIndex ) { entry [ newAttributeName ] = 1 ; } else { entry [ newAttributeName ] = 0 ; } } ) ; } ) ; } } ) ; return outputAttributes ; }
this mutates arffData
this mutates arffData