[译]8 个实用的 JavaScript 技巧

栏目: JavaScript · 发布时间: 5年前

内容简介:每种编程语言都它独特的技巧。其中很多都是为开发人员所熟知的,但其中一些相当的 hackish。在这边篇文章中,我将向你展示一些我觉得有用的技巧。其中一些我在实践中使用过,而另一些则是解决老问题的新方法。Enjoy!不知道你是否遇见过这样的情况,在处理网格结构的时候,如果原始数据每行的长度不相等,就需要重新创建该数据。好吧,我遇到过!为了确保每行的数据长度相等,你可以使用ES6 提供了几种非常简洁的数组去重的方法。但不幸的是,它们并不适合处理非基本类型的数组。稍后你可以在棘手的数组去重一文中读到更多有关它的信

每种编程语言都它独特的技巧。其中很多都是为开发人员所熟知的,但其中一些相当的 hackish。在这边篇文章中,我将向你展示一些我觉得有用的技巧。其中一些我在实践中使用过,而另一些则是解决老问题的新方法。Enjoy!

1. 确保数组的长度

不知道你是否遇见过这样的情况,在处理网格结构的时候,如果原始数据每行的长度不相等,就需要重新创建该数据。好吧,我遇到过!为了确保每行的数据长度相等,你可以使用 Array.fill 方法。

let array = Array(5).fill('');
console.log(array); // 输出(5)["", "", "", "", ""]
复制代码

2. 数组去重

ES6 提供了几种非常简洁的数组去重的方法。但不幸的是,它们并不适合处理非基本类型的数组。稍后你可以在棘手的数组去重一文中读到更多有关它的信息。这里我们只关注基本类型的数组去重。

const cars = [
    'Mazda', 
    'Ford', 
    'Renault', 
    'Opel', 
    'Mazda'
]
const uniqueWithArrayFrom = Array.from(new Set(cars));
console.log(uniqueWithArrayFrom); // 输出 ["Mazda", "Ford", "Renault", "Opel"]

const uniqueWithSpreadOperator = [...new Set(cars)];
console.log(uniqueWithSpreadOperator);// 输出 ["Mazda", "Ford", "Renault", "Opel"]
复制代码

3. 用扩展运算符合并对象和对象数组

合并对象并不是一个罕见的问题,你很有可能已经遇到过这个问题,并且在不远的未来还会再次遇到。不同的是,在过去你手动完成了大部分工作,但从现在开始,你将使用 ES6 的新功能。

// 合并对象
const product = { name: 'Milk', packaging: 'Plastic', price: '5$' }
const manufacturer = { name: 'Company Name', address: 'The Company Address' }

const productManufacturer = { ...product, ...manufacturer };
console.log(productManufacturer); 
// 输出 { name: "Company Name", packaging: "Plastic", price: "5$", address: "The Company Address" }

// 将对象数组合并成一个对象
const cities = [
    { name: 'Paris', visited: 'no' },
    { name: 'Lyon', visited: 'no' },
    { name: 'Marseille', visited: 'yes' },
    { name: 'Rome', visited: 'yes' },
    { name: 'Milan', visited: 'no' },
    { name: 'Palermo', visited: 'yes' },
    { name: 'Genoa', visited: 'yes' },
    { name: 'Berlin', visited: 'no' },
    { name: 'Hamburg', visited: 'yes' },
    { name: 'New York', visited: 'yes' }
];

const result = cities.reduce((accumulator, item) => {
  return {
    ...accumulator,
    [item.name]: item.visited
  }
}, {});

console.log(result);
/* 输出
Berlin: "no"
Genoa: "yes"
Hamburg: "yes"
Lyon: "no"
Marseille: "yes"
Milan: "no"
New York: "yes"
Palermo: "yes"
Paris: "no"
Rome: "yes"
*/
复制代码

4. 数组映射(不使用 Array.map

你知道这里有另外一种方法可以实现数组映射,而不使用 Array.map 吗?如果不知道,请继续往下看。

const cities = [
    { name: 'Paris', visited: 'no' },
    { name: 'Lyon', visited: 'no' },
    { name: 'Marseille', visited: 'yes' },
    { name: 'Rome', visited: 'yes' },
    { name: 'Milan', visited: 'no' },
    { name: 'Palermo', visited: 'yes' },
    { name: 'Genoa', visited: 'yes' },
    { name: 'Berlin', visited: 'no' },
    { name: 'Hamburg', visited: 'yes' },
    { name: 'New York', visited: 'yes' }
];

const cityNames = Array.from(cities, ({ name}) => name);
console.log(cityNames);
// 输出 ["Paris", "Lyon", "Marseille", "Rome", "Milan", "Palermo", "Genoa", "Berlin", "Hamburg", "New York"]
复制代码

5. 根据条件添加对象属性

现在,你不再需要根据条件创建两个不同的对象,以使其具有特定属性。扩展操作符将是一个完美的选择。

const getUser = (emailIncluded) => {
  return {
    name: 'John',
    surname: 'Doe',
    ...(emailIncluded ? { email : 'john@doe.com' } : null)
  }
}

const user = getUser(true);
console.log(user); // 输出 { name: "John", surname: "Doe", email: "john@doe.com" }

const userWithoutEmail = getUser(false);
console.log(userWithoutEmail); // 输出 { name: "John", surname: "Doe" }
复制代码

6. 解构原始数据

你曾经有处理过拥有非常多属性的对象吗?我相信你一定有过。可能最常见的情况是我们有一个用户对象,它包含了所有的数据和细节。这里,我们可以调用新的 ES 解构方法来处理这个大麻烦。让我们看看下面的例子。

const rawUser = {
   name: 'John',
   surname: 'Doe',
   email: 'john@doe.com',
   displayName: 'SuperCoolJohn',
   joined: '2016-05-05',
   image: 'path-to-the-image',
   followers: 45
   ...
}
复制代码

通过把上面的对象分成两个,我们可以用更能传递上下文含义的方式来表示这个对象,如下所示:

let user = {}, userDetails = {};
({ name: user.name, surname: user.surname, ...userDetails } = rawUser);

console.log(user); // 输出 { name: "John", surname: "Doe" }
console.log(userDetails); // 输出 { email: "john@doe.com", displayName: "SuperCoolJohn", joined: "2016-05-05", image: "path-to-the-image", followers: 45 }
复制代码

7. 动态设置对象属性名

在过去,如果我们需要动态设置对象的属性名,我们必须首先声明一个对象,然后再给它分配一个属性。这不可能以单纯声明的方式实现。今时不同往日,现在我们可以通过 ES6 的功能实现这一目标。

const dynamic = 'email';
let user = {
    name: 'John',
    [dynamic]: 'john@doe.com'
}
console.log(user); // 输出 { name: "John", email: "john@doe.com" }
复制代码

8. 字符串插值

最后尤为重要的是拼接字符串的新方法。如果你想在一个辅助程序中构建模版字符串,这会非常有用。它使动态连接字符串模版变得更简单了。

const user = {
  name: 'John',
  surname: 'Doe',
  details: {
    email: 'john@doe.com',
    displayName: 'SuperCoolJohn',
    joined: '2016-05-05',
    image: 'path-to-the-image',
    followers: 45
  }
}

const printUserInfo = (user) => { 
  const text = `The user is ${user.name} ${user.surname}. Email: ${user.details.email}. Display Name: ${user.details.displayName}. ${user.name} has ${user.details.followers} followers.`
  console.log(text);
}

printUserInfo(user);
// 输出 'The user is John Doe. Email: john@doe.com. Display Name: SuperCoolJohn. John has 45 followers.'
复制代码

总结

JavaScript 的世界正在迅速扩展。这里有许多很酷的功能,可以随时使用。棘手和耗时的问题正逐渐淡出过去,而且借助 ES6 的新功能,我们有了很多开箱即用的新解决方案。

这就是今天我想分享的全部内容。如果你也喜欢这篇文章,请转发或者点赞呦。

谢谢你的阅读,我们下次再见。

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。

掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 、官方微博、 知乎专栏


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C# Primer Plus

C# Primer Plus

Klaus Michelsen / Sams / 2001-12-15 / USD 49.99

C# Primer Plus is a tutorial based introduction to the C# language and important parts of the .Net Framework. Throughout the book the reader will be exposed to proven principles enabling him to write ......一起来看看 《C# Primer Plus》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换