Как получить этот тип вывода из следующего ввода, используя lodash - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий массив ввода, который генерируется динамически.

let array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"]

Этот массив содержит идентификаторы, например, "5c8f653a247a4d513db2468b" и связанный с ним фильтр, например, "5c8f653a247a4d513db2468b_Sat"

Как я могу получить вывод, как это

let outPut = [{"id":"5c8f653a247a4d513db2468b","filter":["Mon","Thu","Wed","Sat"]},{"id":"5c8faea05f60dd0c9447b678","filter":["Tue","Thu","Sat"]}}

с использованием lodash или javascript

Ответы [ 6 ]

1 голос
/ 25 марта 2019

Если вы используете lodash и хотите использовать функциональный подход, вам необходимо:

  • Разделить каждый элемент на пару [id, filter]
  • Отфильтровать элементы, которые имеют только идентификатор
  • Группировка товаров по идентификатору
  • Формат объектов

const { flow, partialRight: pr, split, filter, groupBy, first, last, map  } = _;

const fn = flow(
  pr(map, item => split(item, '_')), // convert to [id, filter] pairs
  pr(filter, { length: 2 }), // filter out items without filter
  pr(groupBy, first), // group by the 1st item in each pair
  pr(map, (group, id) => ({ // format the objects
    id,
    filter: map(group, last) // get the filters from the pairs
  }))
)

const array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];

const result = fn(array);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И более краткая версия lodash / fp:

const { flow, split, filter, groupBy, first, last, map  } = _;

const fn = flow(
  map(split('_')), // convert to [id, filter] pairs
  filter({ length: 2 }), // filters items without filter
  groupBy(first), // group by the 1st item in each pair
  map(group => ({ // format the objects
    id: first(first(group)), // take the id from the first item
    filter: map(last, group) // get the filters from the pairs
  }))
)

const array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];

const result = fn(array);

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
1 голос
/ 25 марта 2019

Вы можете разделить строку, используя split, и сохранить дни фильтра в объекте. Затем используйте этот объект для создания желаемого формата.

let array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];

//console.log( array );

// remove items with no underscore
array = array.filter( x => x.indexOf( '_' ) != -1 );

//console.log( array );

// create sortedData object
const sortedData = {};

array.forEach( function( x ) {
  const parts = x.split( '_' );
  const key = parts[0];
  const value = parts[1];
  
  if ( ! ( key in sortedData ) ) {
    sortedData[key] = [];
  }
  
  sortedData[key].push( value );
  
});

//console.log( sortedData );

const output = [];
for ( let key in sortedData ) {
    if ( sortedData.hasOwnProperty( key ) ) {
        output.push( { id: key, filters: sortedData[key] } );
    }
}

console.log( output );
1 голос
/ 25 марта 2019

Вы можете начать кодирование, используя этот сегмент кода

var _ = require('lodash');

const array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];

const regualarData = _.filter(array, item => item.includes("_"));

const plainData = _.map(regualarData, item => {
    return {
      id: item.substring(0, item.indexOf("_")),
      day: item.substring(item.indexOf("_")+1),
    }; 
});

const nested = _.groupBy(plainData, 'id');

const response = [];
for (var key in nested) {
  if (nested.hasOwnProperty(key)) {
    response.push({id: key , filter: _.map(nested[key],t => t.day)});
  }
}

console.log(response);
0 голосов
/ 25 марта 2019

Вы можете использовать неявные цепочечные последовательности lodash функций сбора и использование каждой из сокращений property () функций функций сбора для преобразования этого массива в правильносгруппированный фильтр.

  • Используйте invokeMap () , чтобы разделить каждую строку в массиве разделителем.В этом случае мы делим его на _, в результате чего получается массив ['hash', 'day'].
  • Используйте filter () , чтобы получить только элементы с суффиксом day.Мы будем использовать сокращенный вариант property этой функции сбора и оценим существование суффикса day, который находится под индексом 1.
  • Используйте groupBy () , обратите внимание на сокращенный вариант, чтобы сгруппировать каждый элемент с префиксом hash, который находится под индексом 0.
  • Наконец, используйте map () , чтобы преобразовать объект сгруппированного фильтра в массив сгруппированных фильтров, используя ключ(hash) группы как id.Полученный массив filter получается путем получения суффикса day каждого сгруппированного значения, которое находится под индексом 1, с использованием map(), вариации функции сокращения.

const result = _(array)
  .invokeMap('split', '_')
  .filter(1)
  .groupBy(0)
  .map((v, id) => ({ id, filter: _.map(v, 1) }))
  .value();

const array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];

const result = _(array)
  .invokeMap('split', '_')
  .filter(1)
  .groupBy(0)
  .map((v, id) => ({ id, filter: _.map(v, 1) }))
  .value();
  
console.log(result);
.as-console-wrapper{min-height:100%;top:0!important;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 25 марта 2019

Гораздо короче без загрузки.

var array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"];
array = array.map(v => v.split('_'));
var arr = {};
array.map(ar => {
 if(arr.hasOwnProperty(ar[0])){	
  arr[ar[0]].push(ar[1]);
 }else{
  arr[ar[0]] = [];
 }
});
var _arr = [];
for(key in arr){
 _arr.push({id:key, filter:arr[key]});
}
console.log(_arr);
0 голосов
/ 25 марта 2019

Попробуйте это:

let array = ["5c8f653a247a4d513db2468b", "5c8faea05f60dd0c9447b678", "5c8faea05f60dd0c9447b678_Tue", "5c8faea05f60dd0c9447b678_Thu", "5c8faea05f60dd0c9447b678_Sat", "5c8f653a247a4d513db2468b_Sat", "5c8f653a247a4d513db2468b_Wed", "5c8f653a247a4d513db2468b_Thu", "5c8f653a247a4d513db2468b_Mon"]
var tmpArr = [];
var tmpDay = [];
var output = [];
for(var i = 0; i < array.length; i++){
    var tmp = array[i].split("_");
    if(tmp.length == 1){
        tmpArr.push(array[i]);
        tmpDay.push([]);
    }
    else { 
        tmpDay[tmpArr.indexOf(tmp[0])].push(tmp[1]);
    }
}

for(var i = 0; i < tmpArr.length; i++){
    var tmpObj = {};
    tmpObj.id = tmpArr[i];
    tmpObj.filter = tmpDay[i];
    output.push(tmpObj);
}

console.log(output);
...