【问题标题】:How to slice from an array of objects in js?如何从js中的对象数组中切片?
【发布时间】:2018-10-31 04:12:29
【问题描述】:

我有一个这样的对象数组:

const books =[ 
{id: "1", name: "twilight", category: "Movies", price: 10}, 
{id: "2", name: "jaws", category: "Movies", price: 22}, 
{id: "3", name: "the shining", category: "Movies", price: 1},
{id: "4", name: "beers", category: "Movies", price: 10}, 
{id: "5", name: "apples", category: "Movies", price: 22}, 
{id: "6", name: "mono", category: "Movies", price: 1}
]

尝试分割前 2 个,然后是第二个 2,依此类推。

我怎样才能一次切两本书?

【问题讨论】:

  • 可以更像你想要的输出..
  • 切片前 2 个项目,然后切片第二对等
  • 有什么理由不使用books.slice(0, 2)?这将使您获得前 2 个,然后您只需要不断增加索引即可获得其余部分

标签: javascript arrays lodash


【解决方案1】:

Array.prototype.slice()

slice() 方法将数组的一部分的浅拷贝返回到从开始到结束(不包括结束)选择的新数组对象中。原数组不会被修改。

尝试使用for 循环,每次迭代增加2。将i 的当前值作为start 位置,将i+2 作为end 位置作为方法参数:

const books =[ 
  {id: "1", name: "twilight", category: "Movies", price: 10}, 
  {id: "2", name: "jaws", category: "Movies", price: 22}, 
  {id: "3", name: "the shining", category: "Movies", price: 1},
  {id: "4", name: "beers", category: "Movies", price: 10}, 
  {id: "5", name: "apples", category: "Movies", price: 22}, 
  {id: "6", name: "mono", category: "Movies", price: 1}
]

for(var i=0; i<books.length; i+=2){
  var sliced = books.slice(i, i+2);
  console.log(sliced);
}

【讨论】:

    【解决方案2】:

    您可以使用 slice 函数传递要切片的书籍数量(即 2):

    let slicedBooks = []
    for(var i = 0;i < books.length;i+= 2){
        let part_slice = books.slice(i, 2 + i);
        slicedBooks.push(part_slice);
        console.log(part_slice);
    }
    console.log(slicedBooks);
    

    注意 slice 不会更新 books 数组,而是返回一个新数组。

    【讨论】:

    • 该切片将返回数组上从索引 2 开始的所有内容,而不是他正在寻找的内容,即获取两个一组的元素
    【解决方案3】:

    你可以试试这个切片方法

    return books.slice(0,2).map((book, i) => {
          return;
        });
    

    【讨论】:

      【解决方案4】:

      由于您使用的是lodash,因此您可以使用_.chunk (lodash#chunk) 来填充一个数组数组,该数组包含第一个 2,然后是第二个 2,依此类推...

      _.chunk(books, 2)
      

      这是一个工作示例:

      const books = [ 
          {id: "1", name: "twilight", category: "Movies", price: 10}, 
          {id: "2", name: "jaws", category: "Movies", price: 22}, 
          {id: "3", name: "the shining", category: "Movies", price: 1},
          {id: "4", name: "beers", category: "Movies", price: 10}, 
          {id: "5", name: "apples", category: "Movies", price: 22}, 
          {id: "6", name: "mono", category: "Movies", price: 1}
        ],
        res = _.chunk(books, 2);
        
      console.log(res);
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

      现在,您有了分块数组,迭代并逐一获取您需要的内容!

      【讨论】:

      • @bierhier 所以分块结果有所有的夫妇,第一对夫妇res[0] 第二对夫妇res[1] 等等......基本上你可以迭代(正如我在回答中提到的)@ 987654329@把所有的情侣一一搞定。
      • 不是每个人都想(或可以)使用 lodash,这是一种抽象。语言本身可以做到这一点,看到这一点而不是捷径会更有帮助。
      • @TsarBomba 也可以。但这与everyone 无关,而是针对 OP 的案例,因为他在问题中标记了 lodash。
      【解决方案5】:

      使用一个滑动的寡妇迭代器,它一次在一组 2 本书上

      function two_at_a_time(arr, func){
          for(var i=0; i < arr.length - 1; i++){
              func(arr[i], arr[i + 1]);
          }
      }
      
      two_at_a_time(books, function(current, next){
          console.log(current, next);
      });
      

      【讨论】:

        【解决方案6】:

        您可以使用 for 循环,一次 2 步用于索引,并根据当前索引进行切片。

        for (var i=0; i<books.length; i+=2) {
            console.log(books.slice(i, i+2));
        }
        

        即使有奇数本书,这也有效

        【讨论】:

          【解决方案7】:

          你也可以试试这段代码sn-p -

          var chunckedArray = function(books, chunkCount){
               var chunks = [];
               while(books.length){
                   chunks.push(books.splice(0, chunkCount));
               }
               return chunks;
          };
          
          chunckedArray(books, 2); // [Array(2), Array(2), Array(2)]
          

          【讨论】:

            【解决方案8】:

            100% 等于 php

            function array_slice (arr, offst, lgth, preserveKeys) { // eslint-disable-line camelcase
              //  discuss at: https://locutus.io/php/array_slice/
              // original by: Brett Zamir (https://brett-zamir.me)
              //    input by: Brett Zamir (https://brett-zamir.me)
              // bugfixed by: Kevin van Zonneveld (https://kvz.io)
              //      note 1: Relies on is_int because !isNaN accepts floats
              //   example 1: array_slice(["a", "b", "c", "d", "e"], 2, -1)
              //   returns 1: [ 'c', 'd' ]
              //   example 2: array_slice(["a", "b", "c", "d", "e"], 2, -1, true)
              //   returns 2: {2: 'c', 3: 'd'}
            
            
            
            
              var key = ''
            
              if (Object.prototype.toString.call(arr) !== '[object Array]' || (preserveKeys && offst !== 0)) {
                // Assoc. array as input or if required as output
                var lgt = 0
                var newAssoc = {}
                for (key in arr) {
                  lgt += 1
                  newAssoc[key] = arr[key]
                }
                arr = newAssoc
            
                offst = (offst < 0) ? lgt + offst : offst
                lgth = lgth === undefined ? lgt : (lgth < 0) ? lgt + lgth - offst : lgth
            
                var assoc = {}
                var start = false
                var it = -1
                var arrlgth = 0
                var noPkIdx = 0
            
                for (key in arr) {
                  ++it
                  if (arrlgth >= lgth) {
                    break
                  }
                  if (it === offst) {
                    start = true
                  }
                  if (!start) {
                    continue
                  }++arrlgth
                  if (isInt(key) && !preserveKeys) {
                    assoc[noPkIdx++] = arr[key]
                  } else {
                    assoc[key] = arr[key]
                  }
                }
                // Make as array-like object (though length will not be dynamic)
                // assoc.length = arrlgth;
                return assoc
              }
            
              if (lgth === undefined) {
                return arr.slice(offst)
              } else if (lgth >= 0) {
                return arr.slice(offst, offst + lgth)
              } else {
                return arr.slice(offst, lgth)
              }
            }
            

            【讨论】:

              猜你喜欢
              • 2012-06-05
              • 1970-01-01
              • 2021-12-28
              • 1970-01-01
              • 1970-01-01
              • 2014-04-14
              • 2020-08-07
              • 2022-07-20
              相关资源
              最近更新 更多