У меня есть массив arr объектов, каждый объект имеет форму:

obj={id: /*some string*/,  //id is unique
     msgDetails: { content: /*some string*/,time : /*number*/ }
     }

Чтобы получить индекс определенного элемента по его значению id, я использую следующее:

var idIndex=Babble.messages.findIndex(function(element){
   return element.id===num;
});

Есть ли способ получить все индексы элементов в arr, у которых есть id>=num, где num - заданное число, без цикла for?

0
user8244016 28 Авг 2017 в 23:33

4 ответа

Лучший ответ

Вы можете использовать filter вместо for:

data.filter(d => Number(d.id) > id);
var data = [{
  id: "1",  
  msgDetails: { 
    content: "abc1",
    time: 1 
  }
},{
  id: "2",  
  msgDetails: { 
    content: "abc2",
    time: 1 
  }
},{
  id: "3",  
  msgDetails: { 
    content: "abc3",
    time: 1 
  }
},{
  id: "4",  
  msgDetails: { 
    content: "abc4",
    time: 1 
  }
}];

var filterData = function(id) { 
  return data.filter(d => Number(d.id) > id);
};

console.log(filterData(2));

// Another way

var filterId = function(cond) {
  return data.filter(d => cond(Number(d.id)));
};

console.log(filterId(id => id > 2));
2
DontVoteMeDown 28 Авг 2017 в 20:36

Это позволит зарегистрировать индексы элементов с идентификатором, равным или превышающим указанный идентификатор.

var messages = [
  { id: 10 },
  { id: 12 },
  { id: 2  },
  { id: 20 },
  { id: 30 }
];




function getIndexesForId(id) {
  // Create a result array
  var indexes = [];
  // Loop over all messages.
  messages.forEach((item, index) => {
    // Check if message ID is equal to or larger than requested ID.
    if (item.id >= id) {
      // Push the index of the current item into the result array.
      indexes.push(index);
    }
  });
  
  // Return the array.
  return indexes;
}


console.log(getIndexesForId(10));
console.log(getIndexesForId(20));
0
Thijs 28 Авг 2017 в 20:45

Сначала вы должны использовать map для получения индексов, а затем связать filter с этим:

var Babble = {
    messages: [{ id: "1", msgDetails: { content: "abc", time: 10 }},
               { id: "3", msgDetails: { content: "word", time: 15 }},
               { id: "5", msgDetails: { content: "phrase", time: 12 }},
               { id: "7", msgDetails: { content: "test", time: 21 }}]
};
var num = 4;
var idIndexes = Babble.messages.map( (el, i) => el.id >= num ? i : null )
                               .filter(i => i !== null);

console.log('indexes with id-values greater or equal than ' + num + ':');
console.log(idIndexes);
0
trincot 28 Авг 2017 в 20:45

Вы можете .map() и .filter() коллекция получить желаемые индексы.

var ids = Babble.messages.map((e, i) => [+e.id, i])
                         .filter(a => a[0] >= num)
                         .map(a => a[1]);
2
spanky 28 Авг 2017 в 20:36