freeCodeCamp/guide/chinese/certifications/javascript-algorithms-and-d.../intermediate-algorithm-scri.../seek-and-destroy/index.md

126 lines
6.5 KiB
Markdown
Raw Normal View History

---
title: Seek and Destroy
localeTitle: 寻找和摧毁
---
![:triangular_flag_on_post:](https://forum.freecodecamp.com/images/emoji/emoji_one/triangular_flag_on_post.png?v=3 "triangular_flag_on_post")如果卡住,请记得使用**`Read-Search-Ask`** 。尝试配对程序![:busts_in_silhouette:](https://forum.freecodecamp.com/images/emoji/emoji_one/busts_in_silhouette.png?v=3 "busts_in_silhouette")并编写自己的代码![:pencil:](https://forum.freecodecamp.com/images/emoji/emoji_one/pencil.png?v=3 ":铅笔:")
### ![:checkered_flag:](https://forum.freecodecamp.com/images/emoji/emoji_one/checkered_flag.png?v=3 "checkered_flag")问题说明:
这个问题有点棘手因为你必须熟悉Arguments因为你必须使用两个**或更多,**但在脚本上你只看到两个。很多人用三个参数对这个程序进行硬编码。您将从第一个参数中删除与任何其他参数相同的任何数字。
#### 相关链接
* [参数对象](http://forum.freecodecamp.com/t/javascript-arguments/14283)
* [Array.filter](http://forum.freecodecamp.com/t/javascript-array-prototype-filter/14289)
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 "speech_balloon")提示1
您需要使用`arguments` ,就好像它是一个常规数组。最好的方法是将其转换为一个。
> _现在尝试解决问题_
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 "speech_balloon")提示2
您需要过滤,这也意味着您需要创建一个回调函数。您可以使用各种方法,如: `indexOf()` `includes()` 。如果您需要其他方法, `reduce()`也可能有用;继续阅读那些文档!
> _现在尝试解决问题_
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 "speech_balloon")提示3
要将`arguments`转换为数组,请使用以下代码`var args = Array.prototype.slice.call(arguments);`
> _现在尝试解决问题_
## 扰流警报!
![警告牌](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
**提前解决!**
## ![:beginner:](https://forum.freecodecamp.com/images/emoji/emoji_one/beginner.png?v=3 ":初学者:")基本代码解决方案
```
function destroyer(arr) {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < args.length; j++) {
if (arr[i] === args[j]) {
delete arr[i];
}
}
}
return arr.filter(Boolean);
}
```
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":火箭:") [运行代码](https://repl.it/CLjU/95)
### 代码说明:
1. 使用`Array.prototype.slice.call()`创建一个`arguments`数组,并将其存储在变量`args` 。我们将用它来检查`arr` 。
2. 启动一个基本的`for`循环来迭代`arr` 。在另一个内部嵌套另一个`for`循环,将整数变量`j`和arr更改为args。第二个循环将遍历`args` 。
* 在第二个循环中创建一个`if`语句,严格检查`===` `arr[i]`的当前val等于`args[j]` 。
* 如果两个数组中当前索引的_值_相等请使用`delete`将其从`arr` `delete`
3. 在嵌套循环之外:使用`Boolean`对象返回修改后的数组,作为`delete`运算符创建的任何`null`的过滤器。
#### 相关链接
* \[参数
* [Array.filter](http://forum.freecodecamp.com/t/javascript-array-prototype-filter/14289)
* [删除](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete)
* [布尔](http://forum.freecodecamp.com/t/javascript-boolean/14311)
## ![:sunflower:](https://forum.freecodecamp.com/images/emoji/emoji_one/sunflower.png?v=3 ":向日葵:")中级代码解决方案:
```
function destroyer(arr) {
var args = Array.from(arguments).slice(1);
return arr.filter(function(val) {
return !args.includes(val);
});
}
```
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":火箭:") [运行代码](https://repl.it/Ck2m/0)
### 代码说明:
1. 声明一个名为`args`的变量,并将它设置为等于一个新的`Array`对象`from()`传递给函数的`arguments` 。在相同或下一行从第二个索引1开始对`args`使用`slice()`方法。这将用于过滤的参数分隔为它们自己的`args`数组。
2. 返回已过滤的数组,使用回调函数中的`includes()`来检查`val`是否_不在_ `args` ;返回`true`以保留原始数组中的值,或返回`false`以删除它。
#### 相关链接
* [参数](http://forum.freecodecamp.com/t/javascript-arguments/14283)
* [Array.slice](http://forum.freecodecamp.com/t/javascript-array-prototype-slice/14302)
* [Array.includes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
## 高级代码解决方案
```javascript
const destroyer = (arr, ...args) => arr.filter(i => !args.includes(i));
```
### 代码说明:
* 使用ES6语法的代码使用箭头函数声明函数。
* 使用spread运算符检索参数。
* 使用`includes()`返回已过滤的数组。
#### 相关链接
* [传播运营商](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_operator)
## ![:clipboard:](https://forum.freecodecamp.com/images/emoji/emoji_one/clipboard.png?v=3 ":剪贴板:")捐款说明:
* ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":警告:") **请勿**添加与任何现有解决方案类似的解决方案。如果您认为它**_相似但更好_** ,那么尝试合并(或替换)现有的类似解决方案。
* 添加解决方案的说明。
* 将解决方案分为以下类别之一 - **基本** **中级**和**高级** 。 ![:traffic_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/traffic_light.png?v=3 ":红绿灯:")
* 如果您添加了任何**相关的主要内容,**请仅添加您的用户名。 ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":警告:") **_不要_** _删除任何现有的用户名_
> 看到![:point_right:](https://forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=3 "point_right") [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272)供参考。