【问题标题】:lodash, get matched element's index?lodash,获取匹配元素的索引?
【发布时间】:2016-07-26 02:56:08
【问题描述】:

这是我的情况

var myArray = [undefined, true, false, true];

我想获取项目的索引,它的值为真。使用上面的数组,结果应该是

[1, 3]

因为第 2 项和第 4 项相等。 如何使用 lodash 找到匹配项的索引?

谢谢

【问题讨论】:

  • [...myArray.entries()].filter(([, v]) => v).map(([i]) => i);

标签: javascript lodash


【解决方案1】:

下面是我想到的第一个使用 vanilla JS 的方式:

var myArray = [undefined, true, false, true];

var result = myArray.map((v,i) => v ? i : -1).filter(v => v > -1);

console.log(result);

或者如果你不想使用箭头函数:

var result = myArray.map(function(v,i) { return v ? i : -1; })
                    .filter(function(v) { return v > -1; });

也就是说,首先映射原始数组以输出真正元素的索引,为其他元素输出 -1,然后过滤该结果以仅保留非 -1 的结果。

请注意,映射函数 (v,i) => v ? i : -1 正在测试真实元素 - 如果您只需要布尔值 true 的元素,请使用 (v,i) => v===true ? i : -1

我猜 Lodash 的等价物如下(编辑:感谢 zerkms 对语法的改进):

var myArray = [undefined, true, false, true];

var result = _(myArray).map((v,i) => v ? i : -1).filter(v => v > -1).value();

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.js"></script>

【讨论】:

  • 顺便说一句_(myArray).map(...).filter(...).value()
  • @zerkms - 抱歉,同时编辑以感谢您的贡献,我并没有试图撤消您的编辑。尽管在意外撤消了您的编辑后,我注意到它似乎在没有 .value() 部分的情况下产生了相同的结果 - 为什么会这样?
  • 它是一个 SO 控制台仿真器,具有一些额外的魔力。如果你去一个普通的浏览器控制台,你会看到它返回一些中间的 lodash 包装器。
  • @zerkms - 酷。我认为有一个 Lodash 包装器,但没有考虑 SO 控制台模拟器将如何改变事情。
【解决方案2】:

另一种可能性:

// lodash 

x = _(myArray).map(Array).filter(0).map(1).value()

// vanilla

x = myArray.map(Array).filter(a => a[0]).map(a => a[1])

【讨论】:

  • 这很有教育意义,谢谢!从来没有想过以这种方式使用 lodash#filter 和 lodash#map。我以为他们只会处理对象匹配。
【解决方案3】:
// lodash
var myArray = [undefined, true, false, true];
var indexes = _.reduce(myArray, (result, val, index) => {
    if (val) {
        result.push(index);
    }
    return result;
}, []);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多