如何在JavaScript中从对象数组中切片?

13

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

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本书等。

如何按两本书一组切片?


可以再多一点,就像你期望的输出一样。 - Pankaj Bisht
切片首先是前两个项目,然后是第二对等等。 - bier hier
不使用books.slice(0, 2)有什么原因吗?这将让你获得前两个,然后你只需要不断增加索引以获取其余的部分。 - IvanS95
8个回答

7

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
您可以使用切片函数传递书籍数量进行切片(例如: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开始的数组中的所有内容,而不是他正在寻找的每两个元素一组的内容。 - IvanS95

2
你可以尝试使用切片方法。
return books.slice(0,2).map((book, i) => {
      return;
    });

1
使用滑动窗口迭代器,每次迭代两本书的集合。
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);
});

1

由于您正在使用lodash,因此您可以使用_.chunklodash#chunk)来生成包含前两个、第二个两个等的数组数组...

_.chunk(books, 2)

Here is an working example:

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

现在,你有一个分块的数组,迭代并逐个获取所需内容!

@bierhier,因此,分块结果包含所有的夫妇,第一对为res[0],第二对为res[1],以此类推...基本上你可以遍历(如我在回答中所提到的)res并逐个获取所有的夫妇。 - Koushik Chatterjee
并非每个人都想要(或能够)使用抽象的lodash。语言本身就可以做到这一点,看到这一点会更有帮助,而不是一个快捷方式。 - Tsar Bomba
@TsarBomba也可以这样做。但这与“所有人”无关,而是特定于OP的情况,因为他在问题中标记了lodash。 - Koushik Chatterjee

0

你可以使用每次2个步长的for循环来遍历索引,然后根据当前索引切片。

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

即使有奇数本书,这也适用。


0
您也可以尝试这段代码片段 -
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)]

0

完全等同于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)
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接