Поиск из нескольких источников данных (JSON) - PullRequest
0 голосов
/ 20 декабря 2018

Я ищу строку из нескольких источников данных

ниже приведен фрагмент.Вариант использования:

  1. Условие поиска: sample hybrid

  2. Ожидаемое поведение: `Следует сравнивать каждое слово в каждом источнике данных ивернуть соответствующий объект в "searchResult ['first']" & "searchResult ['second']".то есть «выборка» должна быть найдена в 2 источниках данных и возвращать соответствующий объект, и то же самое должно быть для слова «гибрид».

Я делаю что-то не так и получаю пустой объект.

var dataSource1 = [{
  "_id": "5968dd23fc13ae04d9000001",
  "product_name": "sildenafil citrate",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": "5968dd23fc13ae04d9000002",
  "product_name": "Mountain Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": "5968dd23fc13ae04d9000003",

  "product_name": "Sample HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
  "unit_cost": "$20.53"
}];

var dataSource2 = [{
  "_id": "5968dd23fc13ae04d90000021",
  "product_name": "Hybrid product",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": "5968dd23fc13ae04d90000022",
 
  "product_name": "Mountain Sample Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": "5968dd23fc13ae04d90000033",
  
  "product_name": "Dextromathorphan HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
  "unit_cost": "$20.53"
}];

const searchCriteria = 'sample hybrid';
const searchResult = [];
function compareEachWord(str, searchCriteria) {
  var word = searchCriteria.split(" ");
  for(i=0; i<=word.length; i++) {
    return str.indexOf(word[i]) !== -1;
  }
}


function filterFromDS1() {
  const result =  _.filter(dataSource1, (item) => {
      return compareEachWord(_.toLower(item.product_name), searchCriteria);
  });
  return result;
}


function filterFromDS2() {
  const result =  _.filter(dataSource2, (item) => {
      return compareEachWord(_.toLower(item.product_name), searchCriteria);
  });
  return result;
}

searchResult['first'] = filterFromDS1();
searchResult['second'] = filterFromDS2();

console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>

Ответы [ 6 ]

0 голосов
/ 20 декабря 2018

searchResult должен быть объектом в этом случае, и я думаю, что было бы лучше, если бы вы просто повторно использовали функциональность вместо создания функции для каждого объекта, который вы ищете

function findTerm(arr, terms) {
  terms = terms.split(' ');

  return arr.filter( i => {
    const productTerms = i.product_name.toLowerCase().split(' ')
    for (let i = 0; i < productTerms.length; i++) {
      if (terms.includes(productTerms[i])) return true;
    }
  });
}
const searchCriteria = 'sample hybrid';
const searchResult = {};
searchResult['first'] = findTerm(dataSource1, searchCriteria);
searchResult['second'] = findTerm(dataSource2, searchCriteria);
0 голосов
/ 20 декабря 2018
    const _ = require('lodash')

var dataSource1 = [{
    "_id": "5968dd23fc13ae04d9000001",
    "product_name": "sildenafil citrate",
    "supplier": "Wisozk Inc",
    "quantity": 261,
    "unit_cost": "$10.47"
}, {
    "_id": "5968dd23fc13ae04d9000002",
    "product_name": "Mountain Juniperus ashei",
    "supplier": "Keebler-Hilpert",
    "quantity": 292,
    "unit_cost": "$8.74"
}, {
    "_id": "5968dd23fc13ae04d9000003",

    "product_name": "Sample HBr",
    "supplier": "Schmitt-Weissnat",
    "quantity": 211,
    "unit_cost": "$20.53"
}];

var dataSource2 = [{
    "_id": "5968dd23fc13ae04d90000021",
    "product_name": "Hybrid product",
    "supplier": "Wisozk Inc",
    "quantity": 261,
    "unit_cost": "$10.47"
}, {
    "_id": "5968dd23fc13ae04d90000022",

    "product_name": "Mountain Sample Juniperus ashei",
    "supplier": "Keebler-Hilpert",
    "quantity": 292,
    "unit_cost": "$8.74"
}, {
    "_id": "5968dd23fc13ae04d90000033",

    "product_name": "Dextromathorphan HBr",
    "supplier": "Schmitt-Weissnat",
    "quantity": 211,
    "unit_cost": "$20.53"
}];

const searchCriteria = 'sample hybrid';
const searchResult = [];
function compareEachWord(str, searchCriteria) {
    var sample = searchCriteria.split(" ")[0]
    var hybrid = searchCriteria.split(" ")[1]
    return (str.match(sample) || str.match(hybrid))
}


function filterFromDS1() {
    const result = _.filter(dataSource1, (item) => {
        return compareEachWord(_.toLower(item.product_name), searchCriteria);
    });
    return result;
}

function filterFromDS2() {
    const result = _.filter(dataSource2, (item) => {
        return compareEachWord(_.toLower(item.product_name), searchCriteria);
    });
    return result;
}
searchResult['first'] = filterFromDS1();
searchResult['second'] = filterFromDS2();

console.log(searchResult);
0 голосов
/ 20 декабря 2018

Преобразуйте слова в RegExp (с флагом i - игнорируйте регистр) и используйте RegExp.test(), чтобы найти, содержится ли слово в product_name:

// takes a criteria, converts to regex, and returns a filter function
const filterByCriteria = (searchCriteria) => {
  const searchRegex = new RegExp(_.words(searchCriteria).join('|'), 'i');
  
  // the filtering functions expects a data souce and filters it
  return (ds) => ds.filter(o => searchRegex.test(o.product_name));
};

/** Usage: **/

var dataSource1 = [{"_id":"5968dd23fc13ae04d9000001","product_name":"sildenafil citrate","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d9000002","product_name":"Mountain Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d9000003","product_name":"Sample HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];

var dataSource2 = [{"_id":"5968dd23fc13ae04d90000021","product_name":"Hybrid product","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d90000022","product_name":"Mountain Sample Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d90000033","product_name":"Dextromathorphan HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];

const searchCriteria = 'sample hybrid';

const filterDs = filterByCriteria(searchCriteria);

const searchResult = {
  first: filterDs(dataSource1),
  second: filterDs(dataSource2),
};

console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>

Проблема в вашем коде - функция compareEachWord(), которая немедленно возвращается.Поскольку вы хотите, чтобы функция немедленно возвращала результат, только если он равен true, и, если нет, итерацию до конца, вы можете использовать Array.some():

var dataSource1 = [{"_id":"5968dd23fc13ae04d9000001","product_name":"sildenafil citrate","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d9000002","product_name":"Mountain Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d9000003","product_name":"Sample HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];

var dataSource2 = [{"_id":"5968dd23fc13ae04d90000021","product_name":"Hybrid product","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d90000022","product_name":"Mountain Sample Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d90000033","product_name":"Dextromathorphan HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];

const searchCriteria = 'sample hybrid';
const searchResult = {};
function compareEachWord(str, searchCriteria) {
  var word = searchCriteria.split(" ");
  
  return word.some(w => str.includes(w));
}


function filterFromDS1() {
  const result =  _.filter(dataSource1, (item) => {
      return compareEachWord(_.toLower(item.product_name), searchCriteria);
  });
  return result;
}


function filterFromDS2() {
  const result =  _.filter(dataSource2, (item) => {
      return compareEachWord(_.toLower(item.product_name), searchCriteria);
  });
  return result;
}

searchResult['first'] = filterFromDS1();
searchResult['second'] = filterFromDS2();

console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
0 голосов
/ 20 декабря 2018

пара проблем.Первое, что parndepu идентифицировал, это то, что searchResult должен быть объектом / хэшем.Во-вторых, ваш метод compareEachWord всегда будет возвращать результат поиска первого слова в ваших критериях поиска, даже если оно ложно.У него никогда не будет возможности искать другие критерии.

В качестве бонуса я реорганизовал ваш метод filterFromDS, чтобы он был более СУХИМ.

РЕДАКТИРОВАТЬ: больше микрооптимизаций, особенно, как вам кажетсяиспользовать ES6

const dataSource1 = [{
  "_id": "5968dd23fc13ae04d9000001",
  "product_name": "sildenafil citrate",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": "5968dd23fc13ae04d9000002",
  "product_name": "Mountain Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": "5968dd23fc13ae04d9000003",

  "product_name": "Sample HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
  "unit_cost": "$20.53"
}];

const dataSource2 = [{
  "_id": "5968dd23fc13ae04d90000021",
  "product_name": "Hybrid product",
  "supplier": "Wisozk Inc",
  "quantity": 261,
  "unit_cost": "$10.47"
}, {
  "_id": "5968dd23fc13ae04d90000022",
 
  "product_name": "Mountain Sample Juniperus ashei",
  "supplier": "Keebler-Hilpert",
  "quantity": 292,
  "unit_cost": "$8.74"
}, {
  "_id": "5968dd23fc13ae04d90000033",
  
  "product_name": "Dextromathorphan HBr",
  "supplier": "Schmitt-Weissnat",
  "quantity": 211,
  "unit_cost": "$20.53"
}];

const searchCriteria = 'sample hybrid';
const searchResult = {};

function compareEachWord(str, searchCriteria) {
  const words = searchCriteria.split(" ");
  let hit = false;
  words.forEach(word => {
      if (str.indexOf(word) !== -1) hit = true;
  });
  return hit;
}

function filterFromDS(source) {
  const result = _.filter(source, item => {
      return compareEachWord(_.toLower(item.product_name), searchCriteria);
  });
  return result;
}

searchResult['first'] = filterFromDS(dataSource1);
searchResult['second'] = filterFromDS(dataSource2);

console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
0 голосов
/ 20 декабря 2018

Проблема в CompareEachWord

  for(i=0; i<=word.length; i++) {
    return str.indexOf(word[i]) !== -1;
  }

Оператор возврата останавливает цикл.Вы должны использовать переменную aux, чтобы сравнить все слова

 var hasWord = false;
 for(i=0; i<=word.length; i++) {
    hasWord = (hasWord || str.indexOf(word[i]) !== -1);
  }
 return hasWord;
0 голосов
/ 20 декабря 2018

Ваш searchResult является массивом.Попробуйте изменить его на object.

searchResult = {}; 

Вы получите правильный результат.

...