Asian start-ups step out of Silicon Valley’s shadow

As reported by Shotaro Tani and Tsubasa Suruga at Nikkei Asian Review on 20 Apr 2017. Original article can be found here.

For years, start-ups across Asia have been described as local versions of Silicon Valley players. ...But as their skyrocketing valuations show, investors are starting to realise that successful Asian start-ups are more than carbon copies of western companies.
Local problems, after all, often call for local solutions.
Go-Jek, again, is a prime example. The company is often referred to as “Uber on motorbikes” and the thinking behind the business does have much in common with that of Uber Technologies. But as anyone who has travelled in Indonesia knows, it is practically impossible to get anywhere on time on four wheels, making the more mobile motorbike a better solution.
Go-Jek has also broadened its scope further than Uber has: Its drivers now carry not only people but also parcels and even masseurs to waiting clients. Even in China, where rapid motorization means traveling by car is now the norm, "Uber of China" Didi managed to beat off competition from the Silicon Valley company -- and eventually acquired Uber's Chinese business -- thanks in part to a deeper understanding of the local market.
/** * helper function to take the form and * get back a js object with field/value mappings * ignoring submit fields and fields whose name we can't ascertain */ function serialize(form){ return Array.prototype.slice.call(form.elements) .filter(isInputElement) .filter(isNotSubmit) .filter(hasFieldName) .reduce(function(data, node, index) { data[getFieldName(node)] = node.value return data; }, {}); } /** * Check if this form element is of type input */ function isInputElement(node) { return node.tagName.toLowerCase() === 'input'; } /** * Check if this is a 'submit' input element */ function isNotSubmit(node) { return node.type !== 'submit'; } /** * Ensure field has a derived name */ function hasFieldName(node) { return getFieldName(node) !== 'unknown'; } /** * Attempt to ascertain "name" of field. * * they don't give inputs real `name` attributes, so * best guess is to hack around the element's label text, * falling back to the placeholder text. (their html is * not semantic and often labels erroneously reference * parent divs instead of sibling input elements) * * strip out the stars they show when validation fails * * if label is misplaced _and_ there's no placeholder, * this function is insufficient */ function getFieldName(input) { if (!input.labels.length) return input.placeholder || 'unknown'; var labelText = input.labels[0].textContent.trim(); return ~labelText.indexOf(' *') ? labelText.slice(0, labelText.indexOf(' *')) : labelText; } /** * Listen for form submissions and send identify * if you'd like an event too, just delete the '//' in the track line */ document.forms[0].addEventListener('submit', function(e) { analytics.identify(serialize(e.target)); // analytics.track('Submitted Form'); });