在javascript中切片数组和concat

时间:2015-09-24 04:47:10

标签: javascript arrays

如果arr = [1, 2, 3, 4]一切都很好。

var arr = [1, 2, 3, 4];

function range(min, max) {
    var startArr = arr.slice(arr.indexOf(min)),
        endArr = max < arr.length ? arr.slice(0, arr.indexOf(max) + 1) : [];
    return startArr.concat(endArr);
}


range(3,1);

但是如果arr = [{id:1, name: "John"}, {id:2, name: "Mark"}, {id:3, name: "Jim"},{id:4, name: "Bob"}]此代码不起作用。

jsfiddle

2 个答案:

答案 0 :(得分:0)

考虑使用&#39; lodash&#39; javascript库https://lodash.com/

对于&#39;数组&#39;

听起来像是在追求

  1. 切片 - http://devdocs.io/lodash/index#slice
  2. TakeWhile

答案 1 :(得分:0)

这是因为你的函数的indexOf()部分正在根据值查找索引。在您的第一个数组中,有一些值为31的元素,但第二个是一个对象数组,所以很明显它无法正确找到它们。而是简单地使用给定的直接索引。使用max,min的值作为索引本身。请注意,索引来自0 .. n-1而不是1 .. n。那么range(3,1)就是range(2,0),如果您想将其用作range(3,1),只需从函数中的值中减去1):

function range(min, max) {
    var startArr = max >= min ? arr.slice(min, max + 1) : arr.slice(min),
        endArr = max < min ? arr.slice(0, max + 1) : [];
    return startArr.concat(endArr);
}
...
range(2, 0);

Fiddle Example