【问题标题】:Javascript loop in Array method数组方法中的 Javascript 循环
【发布时间】:2016-05-11 14:30:51
【问题描述】:

当我在数组中有对象时

    var bookIndex =  [{
      id: '1',
      title: 'First title',
      description: 'This is my first title'
    }, {
      id: '2',
      title: 'Second title',
      description: 'This is my second title'
    }];

然后使用 for() 循环遍历数组

    function getBook(bookId){
      for (var i = 0; i < bookIndex.length; i++) {
        if (bookIndex[i].id === bookId) {
          return bookIndex[i];
        }
       }
       return undefined;
     };

我想知道如何使用其他循环方法来获得相同的结果。前任。为每个。 我尝试使用类似的东西,但它无法获得我想要的返回对象。

    function getBook(bookId) {
      bookIndex.forEach(function () {
        if (bookId === bookIndex.id) {
          return bookId;
        }
        return undefined;
      });
    };

【问题讨论】:

  • javascript 中没有 '====' 运算符。将其更改为“===”。
  • 你需要数组loop或数组search
  • 应该getBook()返回一本书还是一个索引?如果只是 inde,你已经有一个,那么你只需要 true 或 false。
  • getBook() 应该将 book 作为对象返回。我的意思是 bookIndex 数组中的 1 个对象。
  • 真正的问题是你想找到第一次出现还是所有出现..?如果你想要第一次出现,最好使用Array.prototype.find(),但如果你需要所有出现,那么Array.prototype.filter() 是你的朋友。

标签: javascript arrays for-loop foreach


【解决方案1】:

你会使用.find():

function getBook(bookId) {
  return bookIndex.find(function(book) { return book.id === bookId; });
}

当满足条件时,对.find() 的回调应该返回true。发生这种情况时,.find() 返回数组的那个元素。如果没有元素匹配,则返回undefined

.forEach() 函数很有用,但它确实适用于您确实想要对数组的 每个 元素执行某些操作的情况。

【讨论】:

  • 如果 find 实现了。
  • 作为 array.find() 的替代方法,您可以使用 array.filter()[0]。
  • @user2415266 是的,这也可以,但是.find() 会在找到匹配项后立即停止,而.filter() 将始终处理整个数组。
  • @Pointy 它是作为替代方案,因为并非所有浏览器都实现了 find():developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
【解决方案2】:

您可以使用 filter 并返回具有该 ID 的对象。

var bookIndex = [{
   id: '1',
   title: 'First title',
   description: 'This is my first title'
 }, {
   id: '2',
   title: 'Second title',
   description: 'This is my second title'
 }];

 function getBook(bookId) {
    return bookIndex.filter((e) => { return parseInt(e.id) == parseInt(bookId)})[0];
 };
 
 console.log(getBook(2))

【讨论】:

  • 是否有任何理由用 (e) =>{} 而不是 function(e){} 来定义匿名函数?我最近在网上看到了很多第一种语法,而我总是使用第二种。
  • 如果你返回结果,虽然你会返回一个数组。我建议返回结果[0]。这样,如果未找到任何元素,您将始终返回第一个找到的元素或 undefined。由于过滤器是由 Id 应用的,因此无论如何不应超过 1 个结果。
  • 这是个好主意。
【解决方案3】:

你可以使用Array#some()

some() 方法测试数组中的某个元素是否通过了提供的函数实现的测试。

function getBook(bookId) {  // returns true or false if the book exists
    return bookIndex.some(function (book) {
        return bookId === book.id;
    });
};

为了返回 book 对象,你可以使用

function getBook(bookId) {  // returns the book with the index
    var book;
    bookIndex.some(function (b) {
        if (bookId === b.id) {
           book = b;
           return true;
        }
    });
    return book;
};

【讨论】:

  • 看起来他想要取回元素,而不仅仅是在数组中。 some() 只返回 true 或 false。
  • 同样,javascript 中没有 '====' 运算符。如果您确实想防止类型强制,请使用“===”。
  • @NinaScholz 当然可以这样。我仍然更喜欢 find() 方法,但正如您正确说明的那样,所有浏览器尚不支持此方法。对我来说,使用 filter()[0] 似乎是最吸引人的解决方案。
  • @user2415266,过滤器正在遍历数组的所有元素。这在这里没有必要,因为想要的元素可能位于数组的开头。对于短路,数组只有两种方法:some 和every。
【解决方案4】:

我问你在哪里想知道你怎么能 for 循环然后返回,因为每个女巫都回答了你没有使用每个我决定向你展示一个 foreach 解决方案,希望这是你所期望的

var bookIndex = [
    {
        id: '1',
        title: 'First title',
        description: 'This is my first title'
    }, {
        id: '2',
        title: 'Second title',
        description: 'This is my second title'
    }];
function getBook(bookId) {
    bookIndex.forEach( function (el) {
        if (el.id === bookId) {
          getBook1(el);
        }
    });
}
getBook('2');
function getBook1(el) {
 var element = el;
    console.log(element);
}

bookIndex.forEach( function (el)中,您需要将参数传递给函数(回调),用于forEach 方法。这是你的主要错误。我通过的这个叫做 el 的元素基本上是你的数组中的每个元素都不是未定义或空的。而且由于你不能只从 foreach 返回一些东西,导致它返回到回调,而不是返回到 parrent 函数,在你的情况下 function getBook(index),我不得不在女巫中调用另一个函数,我可以存储变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多