20181125_ARTS_week22

本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。

Algorithm

/**
 * Maximum Subarray
 * https://leetcode.com/problems/maximum-subarray/
 * 
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
    for (let i = 1; i < nums.length; i++) {
        nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]);
    }
    return Math.max(...nums);
};

console.log(maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4])) // 6

这个解法来自 https://leetcode.com/problems/maximum-subarray/discuss/139218/Javascript-very-clear-and-short-DP-solution

非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。

Review

JavaScript hacks for ES6 hipsters

https://hackernoon.com/javascript-hacks-for-es6-hipsters-67d633ce8ace

文章中介绍了几个 ES6 的有趣用法。

比如用解构去做交换:

let a = 'world', b = 'hello'
[a, b] = [b, a]
console.log(a) // -> hello
console.log(b) // -> world
// Yes, it's magic

解构结合 async/await:

const [user, account] = await Promise.all([
  fetch('/user'),
  fetch('/account')
])

展开操作符用在数组连接上:

const one = ['a', 'b', 'c']
const two = ['d', 'e', 'f']
const three = ['g', 'h', 'i']
// Old way #1
const result = one.concat(two, three)
// Old way #2
const result = [].concat(one, two, three)
// New
const result = [...one, ...two, ...three]

展开操作符用在浅拷贝上:

const obj = { ...oldObj }
const arr = [ ...oldArr ]

解构用在让函数参数更具有可读性上:

const getStuffNotBad = (id, force, verbose) => {
  ...do stuff
}
const getStuffAwesome = ({ id, name, force, verbose }) => {
  ...do stuff
}
// Somewhere else in the codebase... WTF is true, true?
getStuffNotBad(150, true, true)
// Somewhere else in the codebase... I ❤ JS!!!
getStuffAwesome({ id: 150, force: true, verbose: true })

总体来说是篇不错的文章,合理运用这些小技巧,可以让你的代码更简洁易懂。

Tip

介绍下 JavaScript 中获取文件后缀名。

一般情况下我们通常可以用正则表达式或者 String 的 split 方法来做。

比如:

function getFileExtension2(filename) {
  return filename.split('.').pop();
}

这种方法通常情况下都能得到正确的后缀名,但是在一些特别情况下会有问题,比如 "abc", ".abc" 这里后缀名都会被认为是 abc。

一种更好的方法是:

function getFileExtension3(filename) {
  return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
}

console.log(getFileExtension3(''));                            // ''
console.log(getFileExtension3('filename'));                    // ''
console.log(getFileExtension3('filename.txt'));                // 'txt'
console.log(getFileExtension3('.hiddenfile'));                 // ''
console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext'

先用 lastIndexOf 找到 . 最后出现的位置,如果是 "abc" 会返回 -1,如果是 ".abc" 会返回 0,减1之后变为 -2 和 -1,然后做一个无符号右移操作,分别为 4294967294, 4294967295,在这里其实就是去除符号,就算后面 +2 也无济于事,所以最后返回的是 ''

而正常 case 下,-1 之后也是大于等于0的,右移没产生什么作用,之后的 +2 把前面减的 1 给补回来,顺便移到下一位,开始截取。

Share

这周讨论到公司产品在小程序上的一些问题。这里的小程序不单单指微信小程序,甚至包括支付宝小程序,百度小程序等。

一般情况下,说到小程序,大多指微信小程序,不单单是因为微信小程序名气最大,覆盖面最广,还因为微信的使用频率最高,见过手机没装支付宝的,但基本没见过手机没装微信的。

有时候我们在考虑一个产品的时候,会想我们不单提供微信小程序,还提供支付宝小程序,让用户可以选择。

个人觉得,这是一个比较大的误区。让用户做选择不一定是个好主意,好钢用在刀刃上,首先可以算下投入产出比,同样投入做微信小程序和支付宝小程序,如果微信的使用率是 50%,支付宝的使用率是 5%,那在产品形态上自然优先微信小程序,那 5% 的支付宝小程序一般也可以轻易的被微信小程序给取代。

说回给用户选择这个问题上来。往往我们觉得给用户选择是对用户最大的尊重,而实际上却不然。乔布斯没给用户选择,而是告诉用户你用的这个就是最好的,你不需要做选择。就像吃火锅一样,五花八门挑花了眼,浪费太多精力,我最喜欢的就是告诉我先吃啥后吃啥,涮几分钟,吃就得了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

6个编写优质干净代码的技巧

编写干净的代码并不是一件容易的事情,这需要尝试不同的技巧和实践。问题是,在这个问题上有太多的实践和技巧,因此开发人员很难进行选择,所以要把这个问题简化一下。在本...

19310
来自专栏Golang语言社区

Go 谚语

本文译自go-proverbs, 脱胎于 Rob Pike 振奋人心的演讲视频 talk at Gopherfest SV 2015 (bilibili). 不...

3247
来自专栏思考的代码世界

Python网络数据采集之数据清洗|第06天

记得之前我在爬去boss网站的招聘信息的时候,抓取的数据并非我们所理想的样式,后面经过处理后,成为一个自己想要的样子,这个过程可以理解为数据清洗。这里的处理是在...

5197
来自专栏Golang语言社区

厚土Go学习笔记 | 01. Hello World开篇

Go语言的众多特性,是我很长时间以来一直寻找的集合体。一直想在服务器编程方面有一个更舒适的语言。想舒适的实现跨平台,想舒适的实现并发,想舒适的实现纯代码解决问题...

3608
来自专栏牛客网

腾讯暑期实习三面面经

回馈社会,腾讯暑期实习三面面经,正在等hr面试。。。 3.16 晚上8点 一面 电面 40分钟 1.自我介绍 2.position属性 比较 3.浮动清除 4....

41412
来自专栏PHP在线

整洁代码之道——重构

写在前面 现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求。...

4236
来自专栏程序员互动联盟

面向对象语言真有那么棒嘛?

在我的整个编程生涯中,我一直反复思考关于面向对象编程的问题:用还是不用。不过,去年我终于确定下来,决定不再使用面向对象编程,下面我会说明具体原因。 先讲一个小...

3593
来自专栏一个会写诗的程序员的博客

附录C Java编程简史附录C Java编程简史丰富多彩的JVM生态参考资料

在20世纪60年代,软件曾出现过严重危机,由软件错误而引起的信息丢失、系统报废事件屡有发生。为此,1968年,荷兰E.W.Dijkstra提出了程序设计中常用的...

1074
来自专栏落影的专栏

新鲜出炉的iOS面试题

为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。

2202
来自专栏美团技术团队

Hades:移动端静态分析框架

作为全球最大的互联网 + 生活服务平台,美团点评近年来在业务上取得了飞速的发展。为支持业务的快速发展,移动研发团队规模也逐渐从零星的小作坊式运营,演变为千人级研...

963

扫码关注云+社区

领取腾讯云代金券