Skip to main content
deleted 55 characters in body
Source Link
Xotic750
  • 635
  • 6
  • 15
function customGetValues(object, path) {
  path = path.split('.');
  const last = path.pop();
  return path.length ? path.reduce((acc, p) => {
    return acc[p];
  }, object)object[path].map(v => v[last]) : [object[last]];
}

function searchFor(needle, haystack, filter) {
  return filter.some(f => customGetValues(haystack, f).some(v => v.includes(needle)));
}

const hay = [{
  "id": "57db96f4acfaec3218383063",
  "name": {
    "first": "Nora",
    "last": "Cooke"
  },
  "company": "MITROC",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "West Duke"
  }, {
    "id": 1,
    "name": "Williams Kelley"
  }, {
    "id": 2,
    "name": "Amelia Kirk"
  }]
}, {
  "id": "57db96f4d5cae409054d3a5b",
  "name": {
    "first": "Dickson",
    "last": "Moses"
  },
  "company": "VISUALIX",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Patty Carr"
  }, {
    "id": 1,
    "name": "Bowers Wilkerson"
  }, {
    "id": 2,
    "name": "Fox Kidd"
  }]
}, {
  "id": "57db96f42215bea719d83036",
  "name": {
    "first": "Kerr",
    "last": "Gray"
  },
  "company": "TUBESYS",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Rose Pierce"
  }, {
    "id": 1,
    "name": "Matthews Moore"
  }, {
    "id": 2,
    "name": "Brenda Ayala"
  }]
}, {
  "id": "57db96f435d0f064afc90768",
  "name": {
    "first": "Elsie",
    "last": "Dejesus"
  },
  "company": "KLUGGER",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Gina Cruz"
  }, {
    "id": 1,
    "name": "Nieves Carrillo"
  }, {
    "id": 2,
    "name": "Chandler Sanford"
  }]
}, {
  "id": "57db96f4597631fffff36b6b",
  "name": {
    "first": "Chan",
    "last": "Mcdaniel"
  },
  "company": "AQUACINE",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Hodge Sweeney"
  }, {
    "id": 1,
    "name": "Sweet Burnett"
  }, {
    "id": 2,
    "name": "Lynn Hunter"
  }]
}];

const filter = ['company', 'friends.name'];
console.log('Sweet', hay.map(element => searchFor('Sweet', element, filter)));
console.log('Rose', hay.map(element => searchFor('Rose', element, filter)));
function customGetValues(object, path) {
  path = path.split('.');
  const last = path.pop();
  return path.length ? path.reduce((acc, p) => {
    return acc[p];
  }, object).map(v => v[last]) : [object[last]];
}

function searchFor(needle, haystack, filter) {
  return filter.some(f => customGetValues(haystack, f).some(v => v.includes(needle)));
}

const hay = [{
  "id": "57db96f4acfaec3218383063",
  "name": {
    "first": "Nora",
    "last": "Cooke"
  },
  "company": "MITROC",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "West Duke"
  }, {
    "id": 1,
    "name": "Williams Kelley"
  }, {
    "id": 2,
    "name": "Amelia Kirk"
  }]
}, {
  "id": "57db96f4d5cae409054d3a5b",
  "name": {
    "first": "Dickson",
    "last": "Moses"
  },
  "company": "VISUALIX",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Patty Carr"
  }, {
    "id": 1,
    "name": "Bowers Wilkerson"
  }, {
    "id": 2,
    "name": "Fox Kidd"
  }]
}, {
  "id": "57db96f42215bea719d83036",
  "name": {
    "first": "Kerr",
    "last": "Gray"
  },
  "company": "TUBESYS",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Rose Pierce"
  }, {
    "id": 1,
    "name": "Matthews Moore"
  }, {
    "id": 2,
    "name": "Brenda Ayala"
  }]
}, {
  "id": "57db96f435d0f064afc90768",
  "name": {
    "first": "Elsie",
    "last": "Dejesus"
  },
  "company": "KLUGGER",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Gina Cruz"
  }, {
    "id": 1,
    "name": "Nieves Carrillo"
  }, {
    "id": 2,
    "name": "Chandler Sanford"
  }]
}, {
  "id": "57db96f4597631fffff36b6b",
  "name": {
    "first": "Chan",
    "last": "Mcdaniel"
  },
  "company": "AQUACINE",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Hodge Sweeney"
  }, {
    "id": 1,
    "name": "Sweet Burnett"
  }, {
    "id": 2,
    "name": "Lynn Hunter"
  }]
}];

const filter = ['company', 'friends.name'];
console.log('Sweet', hay.map(element => searchFor('Sweet', element, filter)));
console.log('Rose', hay.map(element => searchFor('Rose', element, filter)));
function customGetValues(object, path) {
  path = path.split('.');
  const last = path.pop();
  return path.length ? object[path].map(v => v[last]) : [object[last]];
}

function searchFor(needle, haystack, filter) {
  return filter.some(f => customGetValues(haystack, f).some(v => v.includes(needle)));
}

const hay = [{
  "id": "57db96f4acfaec3218383063",
  "name": {
    "first": "Nora",
    "last": "Cooke"
  },
  "company": "MITROC",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "West Duke"
  }, {
    "id": 1,
    "name": "Williams Kelley"
  }, {
    "id": 2,
    "name": "Amelia Kirk"
  }]
}, {
  "id": "57db96f4d5cae409054d3a5b",
  "name": {
    "first": "Dickson",
    "last": "Moses"
  },
  "company": "VISUALIX",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Patty Carr"
  }, {
    "id": 1,
    "name": "Bowers Wilkerson"
  }, {
    "id": 2,
    "name": "Fox Kidd"
  }]
}, {
  "id": "57db96f42215bea719d83036",
  "name": {
    "first": "Kerr",
    "last": "Gray"
  },
  "company": "TUBESYS",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Rose Pierce"
  }, {
    "id": 1,
    "name": "Matthews Moore"
  }, {
    "id": 2,
    "name": "Brenda Ayala"
  }]
}, {
  "id": "57db96f435d0f064afc90768",
  "name": {
    "first": "Elsie",
    "last": "Dejesus"
  },
  "company": "KLUGGER",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Gina Cruz"
  }, {
    "id": 1,
    "name": "Nieves Carrillo"
  }, {
    "id": 2,
    "name": "Chandler Sanford"
  }]
}, {
  "id": "57db96f4597631fffff36b6b",
  "name": {
    "first": "Chan",
    "last": "Mcdaniel"
  },
  "company": "AQUACINE",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Hodge Sweeney"
  }, {
    "id": 1,
    "name": "Sweet Burnett"
  }, {
    "id": 2,
    "name": "Lynn Hunter"
  }]
}];

const filter = ['company', 'friends.name'];
console.log('Sweet', hay.map(element => searchFor('Sweet', element, filter)));
console.log('Rose', hay.map(element => searchFor('Rose', element, filter)));
Source Link
Xotic750
  • 635
  • 6
  • 15

For your specific haystack and filter, without recursion, and using ES6.

function customGetValues(object, path) {
  path = path.split('.');
  const last = path.pop();
  return path.length ? path.reduce((acc, p) => {
    return acc[p];
  }, object).map(v => v[last]) : [object[last]];
}

function searchFor(needle, haystack, filter) {
  return filter.some(f => customGetValues(haystack, f).some(v => v.includes(needle)));
}

const hay = [{
  "id": "57db96f4acfaec3218383063",
  "name": {
    "first": "Nora",
    "last": "Cooke"
  },
  "company": "MITROC",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "West Duke"
  }, {
    "id": 1,
    "name": "Williams Kelley"
  }, {
    "id": 2,
    "name": "Amelia Kirk"
  }]
}, {
  "id": "57db96f4d5cae409054d3a5b",
  "name": {
    "first": "Dickson",
    "last": "Moses"
  },
  "company": "VISUALIX",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Patty Carr"
  }, {
    "id": 1,
    "name": "Bowers Wilkerson"
  }, {
    "id": 2,
    "name": "Fox Kidd"
  }]
}, {
  "id": "57db96f42215bea719d83036",
  "name": {
    "first": "Kerr",
    "last": "Gray"
  },
  "company": "TUBESYS",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Rose Pierce"
  }, {
    "id": 1,
    "name": "Matthews Moore"
  }, {
    "id": 2,
    "name": "Brenda Ayala"
  }]
}, {
  "id": "57db96f435d0f064afc90768",
  "name": {
    "first": "Elsie",
    "last": "Dejesus"
  },
  "company": "KLUGGER",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Gina Cruz"
  }, {
    "id": 1,
    "name": "Nieves Carrillo"
  }, {
    "id": 2,
    "name": "Chandler Sanford"
  }]
}, {
  "id": "57db96f4597631fffff36b6b",
  "name": {
    "first": "Chan",
    "last": "Mcdaniel"
  },
  "company": "AQUACINE",
  "email": "[email protected]",
  "friends": [{
    "id": 0,
    "name": "Hodge Sweeney"
  }, {
    "id": 1,
    "name": "Sweet Burnett"
  }, {
    "id": 2,
    "name": "Lynn Hunter"
  }]
}];

const filter = ['company', 'friends.name'];
console.log('Sweet', hay.map(element => searchFor('Sweet', element, filter)));
console.log('Rose', hay.map(element => searchFor('Rose', element, filter)));