使用下划线根据嵌套数组对象中的条件查找数组索引

时间:2018-07-12 16:12:42

标签: javascript underscore.js

所以,我有此数据,假设我正在尝试查找包含特定日期的数组的索引(比如说'2018-01-03')

var arr = [
   [{ id: 'A1', start: '2018-01-01' }, { id: 'A2', start: '2018-01-01' }], // 0
   [{ id: 'B1', start: '2018-01-02' }, { id: 'B2', start: '2018-01-02' }], // 1
   [{ id: 'C1', start: '2018-01-03' }, { id: 'C2', start: '2018-01-03' }] // 2 <<<Want this index which should be 2     
];

在我的arr数组中,我有另一组数组-每个数组都有一个特定日期的事件。我的目标是找到具有特定日期的数组的数组索引。下面是我目前拥有的东西,但是我从错误的数组中获取索引(我认为)。

var date = '2018-01-03';

var currentIndex = _.findIndex(arr, function(obj) {
    return obj[0].start == date ;
});  //currentIndex should equal 2

我感觉自己正在正确启动,但是也许我还需要映射一些东西?

编辑 我没有使用ES6,所以我认为箭头功能不会对我有用。

3 个答案:

答案 0 :(得分:1)

在使用moment时,isSame可用于检查相同的日期。

注意:由于Firefox不支持RFC2822或ISO格式以外的日期格式,因此需要立即提供格式。

var arr = [
   [{ id: 'A1', start: '2018-01-01' }, { id: 'A2', start: '2018-01-01' }], // 0
   [{ id: 'B1', start: '2018-01-02' }, { id: 'B2', start: '2018-01-02' }], // 1
   [{ id: 'C1', start: '2018-01-03' }, { id: 'C2', start: '2018-01-03' }] // 2 <<<Want this index which should be 2     
];

function result(date)
{
    return arr.findIndex(function(value){
        return value.find(function(val){
            return moment(val.start,"YYYY-MM-DD").isSame(moment(date,"YYYY-MM-DD"));
         });
    });
}
console.log(result('2018-01-02'));
console.log(result('2018-01-01'));
console.log(result('2018-01-03'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

答案 1 :(得分:0)

您正在使用Vanilla JavaScript的array#findIndexarray#some寻找类似的内容:

<form class=" jumbotron browseCategory bs1">
    <h3 class="catSearch">SEARCH ADS USING CATEGORY SEARCH</h3> <br/> <hr/>
        <div class="form-group">
                    <label for="formGroupExampleInput2"> Select your category : </label>
                <select id="myselect">
                    <option value="1">Mobile</option>
                    <option value="2">Electronics</option>
                    <option value="3">Property</option>
                    <option value="4">Cosmetics</option>
                  </select> </div>
 <button type="submit" class="btn btn-primary" id="submission_cat">Search Ad of this Category</button>
    </form>

ES6之前的版本:

var arrN = [
   [{ id: 'A1', start: '2018-01-01' }, { id: 'A2', start: '2018-01-01' }], // 0
   [{ id: 'B1', start: '2018-01-02' }, { id: 'B2', start: '2018-01-02' }], // 1
   [{ id: 'C1', start: '2018-01-03' }, { id: 'C2', start: '2018-01-03' }] // 2 <<<Want this index which should be 2     
];

var date = '2018-01-03';

// if each element of sub-array has same date
console.log('index of '+ date + " is --> " + arrN.findIndex(e => e[0].start == date));


// if each element of sub-array do not have same date
console.log(arrN.findIndex(e => e.some(obj => obj.start == date)));   

答案 2 :(得分:0)

如果findIndexArray.some用于内部数组,请使用组合键:

let availableIndex = arr.findIndex(a => a.some(b => b.start === date)); //2 for your example