在lodash map()中更改起始位置

时间:2015-06-06 16:54:17

标签: javascript arrays lodash

我需要从索引1开始映射数组,而不是0。如何使用map()执行此操作?这是我到目前为止所做的:

function getStoryCard(value, key) {
    return {
        imageSection: storyCardMedia[OVERVIEW_DRAWERS_CONSTANTS.STORYCARD + key],
        linkOut: value.Link || null,
        subTitle: value.Subtitle || null,
        title: value.Title || null,
        viewMore: value.ViewMore ? getViewMore(value.ViewMore) : null,
        type: storyCardType
    }
}

// This method gets an object array
// [Object, Object....]
storyCards = _.map(pickedCards, getStoryCard);

// Set index to 1, but map method already has executed
for (var i = 1; i <= storyCards.length; i++) {

    if (storyCards.imageSection === undefined) {
        storyCards.splice(0, 1);
    }

    storyCards[i];
}

return storyCards;

3 个答案:

答案 0 :(得分:2)

在调用map之前,使用数组上的切片函数。

我相信

arr.slice(1)

将为您提供减去第一个条目的数组。

答案 1 :(得分:2)

为什么不使用rest()

storyCards = _.map(_.rest(pickedCards), getStoryCard);

答案 2 :(得分:1)

_.map 传递索引 - 它只在您传入对象时提供键,并且由于您传入的是数组,因此您是可靠的。

但是,与filter不同,map总是在返回的数组中插入一个值,即使该值类似于undefined(如果您决定在索引0处返回)。因此,您最终会得到类似[undefined,{},{},{}]的内容。不好。

您可以解决此问题的一种方法是使用另一种lodash方法compact。 Compact简单地遍历数组,删除falsey值。您的上述代码示例将变为:

function getStoryCard(value, index) {
    imageSection = storyCardMedia[OVERVIEW_DRAWERS_CONSTANTS.STORYCARD + index];

    if (!imageSection || index === 0) return;       

    return {
        imageSection: imageSection,
        linkOut: value.Link || null,
        subTitle: value.Subtitle || null,
        title: value.Title || null,
        viewMore: value.ViewMore ? getViewMore(value.ViewMore) : null,
        type: storyCardType
    }
}

return _.compact(_.map(pickedCards, getStoryCard));

我们遍历pickedCards,接受我们希望的那些卡片。我们不想插入的那些卡片只会在数组中变为undefinedcompact随后会删除它们。希望这有帮助!