Skip to content

Instantly share code, notes, and snippets.

@latimeks
Created June 25, 2018 15:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save latimeks/f8e86ec44334797baf06f933b4ccecd4 to your computer and use it in GitHub Desktop.
Save latimeks/f8e86ec44334797baf06f933b4ccecd4 to your computer and use it in GitHub Desktop.
Mcdonalds menu crawl gist
import React, { Component } from 'react';
import './App.css';
import axios from 'axios'
import MenuCombo from './menucombo'
const heading = "Enter a price cap here for recommendations"
class App extends Component {
constructor(props){
super(props)
this.state = {
data:[]
}
}
handleSubmit = (e) => {
e.preventDefault()
let PriceCap = this.input.value;
axios.get(`/?${PriceCap}`)
.then(response =>{
let data = response.data
console.log(data)
this.setState({data})
})
.catch(err => {
console.log("NOT FOUND",err)
})
}
render() {
return (
<div className="App">
<header className="App-header">
<h1 className="App-title">{heading}</h1>
</header>
<div className = "Menu-card">
<form onSubmit={this.handleSubmit}>
<label>Enter a price</label>
<input name = 'PriceCap'
ref={node => {this.input = node}}
type = 'number'
min = '1'
max ='20' />
<button>Generate Suggestions</button>
<MenuCombo data={this.state.data} />
</form>
</div>
</div>
);
}
}
export default App;
const express = require('express')
const app = express()
const Combinatorics = require("js-combinatorics");
const reducer = (accumulator, currentValue) => accumulator + currentValue;
app.get('/', function (req, res) {
console.log(req.query);
var max = 10;
var cmb, total, items;
var data = require('./subset.json');
var parsed_data = [];
var parsed_item = {};
var entry = {};
var results = [];
data.forEach(function(i){
parsed_item = {};
parsed_item[i['ITEM']] = i['PRICE'];
parsed_data.push(parsed_item);
});
cmb = Combinatorics.power(parsed_data);
cmb.forEach(function(a){
total = 0.0;
items = [];
a.forEach(function(b){
total += Object.values(b).reduce(reducer);
items.push(b);
});
if (total <= max && total != 0) {
entry = {};
entry['total'] = total.toFixed(2);
entry['items'] = items;
results.push(entry);
}
});
var fs = require('fs');
fs.writeFile("output.json", JSON.stringify(results), function(err) {
if (err) {
console.log(err);
}
});
console.log("Results returning: ", results)
res.send(results);
})
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:3000");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "Origin,Content-Type, Authorization, x-id, Content-Length, X-Requested-With");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
next();
});
app.listen(3001, () => console.log('Example app listening on port 3001'))
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();
import React from 'react'
class MenuCombo extends React.Component{
render(){
return(
<ul>
{this.props.data.map(item => {
return(
<li key={item.id}>{item.name}</li>
)
})}
</ul>
)
}
}
export default MenuCombo
{
"name": "budget-food",
"version": "0.1.0",
"private": true,
"dependencies": {
"axios": "^0.18.0",
"js-combinatorics": "^0.5.3",
"react": "^16.4.1",
"react-dom": "^16.4.1",
"react-scripts": "1.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"proxy": "http://localhost:3001"
}
[
{
"ID" : 1,
"CAL": "540",
"FAT": "28",
"SFAT": "10",
"TFAT": "1",
"CHOL": "80",
"SALT": "970",
"CARB": "47",
"FBR": "3",
"SGR": "9",
"PRO": "25",
"ITEM": "Big Mac 7.5 oz (212 g)",
"CATEGORY": "BURGERSANDWICH",
"PRICE": 3.99,
"MEALPRICE": 5.99
},
{
"ID" : 2,
"CAL": "300",
"FAT": "12",
"SFAT": "6",
"TFAT": "0.5",
"CHOL": "40",
"SALT": "680",
"CARB": "33",
"FBR": "2",
"SGR": "7",
"PRO": "15",
"ITEM": "Cheeseburger 4 oz (113 g)",
"CATEGORY": "BURGERSANDWICH",
"PRICE": 1.00
},
{
"ID" : 3,
"CAL": "540",
"FAT": "28",
"SFAT": "13",
"TFAT": "1.5",
"CHOL": "100",
"SALT": "1110",
"CARB": "42",
"FBR": "3",
"SGR": "10",
"PRO": "31",
"ITEM": "Quarter Pounder\u00ae with Cheese 7.3 oz (206 g)",
"CATEGORY": "BURGERSANDWICH",
"PRICE": 3.79,
"MEALPRICE": 5.79
},
{
"ID" : 4,
"CAL": "780",
"FAT": "45",
"SFAT": "21",
"TFAT": "2.5",
"CHOL": "175",
"SALT": "1310",
"CARB": "43",
"FBR": "3",
"SGR": "10",
"PRO": "50",
"ITEM": "Double Quarter Pounder with Cheese 10.3 oz (291 g)",
"CATEGORY": "BURGERSANDWICH",
"PRICE": 4.79,
"MEALPRICE": 6.69
},
{
"ID" : 5,
"CAL": "740",
"FAT": "41",
"SFAT": "16",
"TFAT": "1.5",
"CHOL": "125",
"SALT": "1480",
"CARB": "51",
"FBR": "4",
"SGR": "14",
"PRO": "40",
"ITEM": "Bacon Clubhouse Burger 9.7 oz (274 g)",
"CATEGORY": "BURGERSANDWICH",
"PRICE" : 4.49,
"MEALPRICE" : 6.49
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment