在Javascript中查找元素的详细教程

104 阅读6分钟

JavaScript中的数组find()函数返回数组中通过所提供的函数测试的第一个元素的值。让我们深入了解一下数组find()方法。

Javascript数组查找

Javascript数组find()是一个内置函数,用于获取数组中符合所提供条件的第一个元素的值。find()函数接受函数thisValue作为参数。find()函数接受元素、索引数组。

array.find()方法检查所有的数组元素,只要第一个元素满足条件,就会打印。如果有一个以上的项目满足条件,则返回第一个满足条件的项目。

如果你需要找到的项目在数组中的索引,请使用findIndex()

如果你需要找到一个值的索引,使用ArrayArray.prototype.indexOf()。如果你需要查找该值是否存在于数组中,使用Array.prototype.includes()

假设你想找到数组中的第一个奇数。 参数函数检查传递给它的参数是否是一个奇数。

find() 函数为数组中的每一个项目调用一个参数函数。参数函数返回真值的第一个奇数被find()函数报告为答案。

语法

数组find()方法的语法如下:

array.find(function(element, index, array),thisValue)

参数

该函数需要以下三个参数:

元素。
这是函数正在处理的当前项目

索引
这是函数正在处理的当前项目的索引

数组。
这是调用Array.filter()函数的数组

另一个参数是thisValue: 它用于告诉函数在执行一个参数函数时使用数组的值。

例子

在这个例子中,我们将使用Node.js来运行JavaScript代码。

因此,让我们创建一个名为app.js的文件并添加以下代码:

// app.js

var data = [20, 18, 15, 10, 9];

var found = data.find(function(element) {
  return element < 12;
});

console.log(found);

所以,我们已经写了一个条件。如果任何一个数组项满足这个条件,它将返回 该元素的值 ,而对数组内元素的进一步检查将被停止。

在这里,109 的值都小于12, 但是,我们仍然得到了10 ,因为10的值在数组中是第一个。

所以只有10会返回,而不是9。如果在数组内找到满足条件的元素,它将立即返回,而不需要进一步检查:

➜  es git:(master) ✗ node app
10
➜  es git:(master) ✗

ES6数组find()

我们可以用ES6标准写上述函数,就像下面这样:

// app.js

const data = [20, 18, 15, 10, 9];

let found = data.find(element => element < 12);

console.log(found);

答案将和前面的一样,但它的语法要轻得多:

现在让我们来看看发现未定义的情况。

// app.js

const data = [20, 18, 15, 10, 9];

let found = data.find(element => element < 9);

console.log(found);

在上面的例子中,所有的元素都大于9;这就是为什么输出将是未定义的:

纯函数

Javascript数组查找方法是一个纯函数,因为它不会改变被调用的数组。相反,它将返回一个满足其条件的值。

使用find()查找数组中的一个元素

现在,写下下面的代码:

// app.js

const fruits = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5}
];

const getFruit = fruits.find(fruit => fruit.name === 'apples');

console.log(getFruit);

在这里,如果成功满足条件,将只返回一个对象:

  es git:(master) ✗ node app
{ name: 'apples', quantity: 2 }
➜  es git:(master) ✗

所以,每当我们有一个场景,需要得到一个数组中的第一个元素的值,并满足所提供的测试函数,我们可以在JavaScript中使用Array.find()方法。

JavaScript数组的搜索

要在JavaScript中搜索数组中的一个元素,可以使用数组find()方法。find()方法检查一个数组是否包含该元素。 让我们举个例子,看看这个人是否是成年人。如果我们从数组中找到第一个满足条件的值,它就会返回。

看,我们正在使用javascript find()函数在数组中搜索一个项目:

// app.js
let ages = [6, 18, 19, 21];

let checkAdult = age => {
  return age >= 18;
}

console.log(ages.find(checkAdult));

在上面的代码中,如果找到第一个大于或等于18的数组元素,那么它将在输出中返回。现在,请看输出:

➜  es git:(master) ✗ node app
18
➜  es git:(master) ✗

:在JavaScript数组中找到一个元素

要找到一个数组是否包含JavaScript数组中的一个元素,可以使用数组includes()方法。Javascript includes()是一个内置的数组 函数,可以确定一个数组是否包含指定的元素。如果包含一个元素,它返回,否则返回假, 不包括数组中的元素。

从ECMAScript 2018开始,我们可以使用Javascriptincludes() 函数。

如果你想支持IE或其他旧的浏览器,那么可以试试下面的代码:

// app.js
 function include(arr,obj) {
    return (arr.indexOf(obj) != -1);
}

在上面的代码中,我们使用了Javascript的indexOf 方法。所以,这就是如何在javascript中搜索数组中的值。

在JavaScript数组中寻找对象

要在一个JavaScript数组中找到一个对象,可以使用array.find()方法。find()方法在数组中搜索所提供的对象,如果该方法找到它,它就会返回该对象。

假设我有一个未识别对象的数组,其中包含有名字的对象的数组,我们需要得到 "名字 "为 "某个字符串"的对象。 请看下面的编程例子:

// app.js
 search = (key, inputArray) => {
  for (let i=0; i < inputArray.length; i++) {
      if (inputArray[i].name === key) {
          return inputArray[i];
      }
  }
}

let arr = [
  { name:"Krunal", value:"Engineer", other: "Author" },
  { name:"Ankit", value:"MCA", other: "Author" }
];

let resultObject = search("Krunal", arr);
console.log(resultObject);

好的,所以在上面的代码中,首先,我们有一个用户定义的函数,叫做搜索函数,它接受两个参数。一个是输入对象的键,另一个是一个输入数组:

它遍历inputArray,并将key与Array的name属性进行比较。如果匹配,那么它就返回整个对象。请看下面的输出。

Javascript Array Find Example | Javascript Array Search

我们也可以使用find()函数来获得相同的值。请看下面的代码。

// app.js
 let arr = [
  { name:"Krunal", value:"Engineer", other: "Author" },
  { name:"Ankit", value:"MCA", other: "Author" }
];

let obj = arr.find(data => data.name === 'Krunal');

console.log(obj);

它将给我们同样的输出,但它是在ES6风格的箭头函数

在JavaScript中寻找一个字符串

要在JavaScript中找到一个字符串,请使用字符串search()方法。Javascript search()方法搜索一个字符串的指定值,并返回匹配的位置。搜索值可以是一个字符串或一个正则表达式。如果没有找到匹配,该方法返回-1。

寻找数组中的素数

下面的例子找到数组中属于质数的元素(如果没有质数则返回未定义):

// app.js

const isPrime = (element, index, array) => {
  let start = 2;
  while (start <= Math.sqrt(element)) {
    if (element % start++ < 1) { return false; } } return element > 1;
}

console.log([4, 6, 8, 11].find(isPrime));
console.log([9, 1, 21, 13].find(isPrime));

请看输出:

➜  es git:(master) ✗ node app
11
13
➜  es git:(master) ✗

使用ES6箭头函数和解构

我们可以通过javascript find()函数在Javascript中使用ES6的箭头函数对象析构。这样一来,代码看起来更清晰,错误更少,而且容易理解。请看下面的代码:

// app.js

const fav = [
  { actress: 'Millie Bobby Brown', age: 16 },
  { actress: 'Kiernan Shipka', age: 19 },
  { actress: 'Emma Watson', age: 29 }
];

const result = fav.find(({ actress }) => actress === 'Millie Bobby Brown');

console.log(result)

输出

node app
{ actress: 'Millie Bobby Brown', age: 16 }

如果上述代码中的女演员是Millie Bobby Brown,它将给我们提供该对象的两个属性;否则,它将给我们提供undefined。

多重填充

JS数组find()方法已经被添加到ECMAScript 2015规范中,可能不是在所有的JavaScript实现中都可用。然而,你可以使用polyfill Array .prototype.find下面的片段:

if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, 'find', {
    value: function (predicate) {
      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return undefined.
      return undefined;
    },
    configurable: true,
    writable: true
  });
}

如果你想支持不支持Object.defineProperty的过时的JavaScript引擎,最好完全不要polyfill Array.prototype,因为你不能让它成为非枚举的。

浏览器支持

特点基本支持
浏览器45
边缘
火狐25
Internet Explorer没有
浏览器32
Safari8
安卓WebView是的
安卓版Chrome浏览器
边缘手机
安卓版火狐浏览器4
安卓版Opera
iOS Safari8

结论

  1. 测试必须以函数的形式提供。
  2. find()方法对数组中的每个元素执行一次回调函数,直到找到一个返回true的值。
  3. 如果没有任何东西通过测试,那么就会返回未定义
  4. find()不会突变或改变原始数组,所以它是一个纯函数。
  5. 每当我们需要获得数组中第一个满足所提供的测试函数的元素的值时,我们在JavaScript中使用Array.find()方法。