2016-03-06 2 views
4

У меня есть массив, который выглядит примерно так:Нахождение индекса массива объекта с Javascript/React.js

var skillsets = [ 
    {id: 'one', name: 'george'}, 
    {id: 'two', name: 'greg'}, 
    {id: 'three', name: 'jason'}, 
    {id: 'four', name: 'jane'}, 
]; 

, что я хотел бы сделать, это найти строку на основе значения, заданного в виде идентификатора с Javascript. Например, если я поместил «id = 'two» в функцию, я бы хотел, чтобы «1» возвращалась как строка.

Я знаю, что для массива с одной строкой, skillsets.indexOf ['value'] будет работать, но это не будет работать для этого набора JSON.

Как я могу это достичь?

EDIT:

Skills = React.createClass({ 

    getInitialState: function() { 
     return { id: 'default' }; 
    }, 

    getIndex(value, arr, prop) { 
    for(var i = 0; i < arr.length; i++) { 
     if(arr[i][prop] === value) { 
      return i; 
     } 
    } 
    return -1; //to handle the case where the value doesn't exist 
    }, 

    render: function() { 

     var index = getIndex(id, skillsets, 'id'); 

     return (

      <section id="three" className="main style1 special"> 
       <div className="container"> 

        <SkillsHeader skillsets={skillsets[index]}/> 
        {index} 
        <SkillsDetails details={details}/> 
        {index} 

       </div> 
      </section> 

     ); 

    } 
}); 

ответ

5

Простой for цикл обернуты в многоразовой функции достаточно хорошо:

function getIndex(value, arr, prop) { 
    for(var i = 0; i < arr.length; i++) { 
     if(arr[i][prop] === value) { 
      return i; 
     } 
    } 
    return -1; //to handle the case where the value doesn't exist 
} 

Здесь value - это значение, которое вы хотите сопоставить, arr - это массив объектов, а prop - свойство каждого итерабельного массива, которое должно соответствовать value.

Вы можете использовать эту функцию для любого json со структурой, которую вы упомянули. В вашем конкретном случае назовите его так:

var index = getIndex('one', skillsets, 'id'); 
+0

Или, возможно, вернуть -1, если не найдено, чтобы соответствовать тому, что делает indexOf()? – nnnnnn

+0

Да, это было бы лучше! –

+0

говоря, что getIndex не определено – user1072337

3

Lodash имеет findIndex метод, который делает именно это.

var users = [ 
    { 'user': 'barney', 'active': false }, 
    { 'user': 'fred', 'active': false }, 
    { 'user': 'pebbles', 'active': true } 
]; 

_.findIndex(users, function(o) { return o.user == 'barney'; }); 
// → 0 

// The `_.matches` iteratee shorthand. 
_.findIndex(users, { 'user': 'fred', 'active': false }); 
// → 1 

// The `_.matchesProperty` iteratee shorthand. 
_.findIndex(users, ['active', false]); 
// → 0 

// The `_.property` iteratee shorthand. 
_.findIndex(users, 'active'); 
// → 2 

Но я думаю, что ES6 поддерживает только версию лямбда в любом случае это в док на the flux page (?):

removeTodo (id) { 
     let index = this.todos.findIndex(todo => todo.get('id') === id); 

     // remove the todo with the ID of id, but only if we have it to begin with 
     this.todos = index > -1 ? 
      this.todos.remove(index) : 
      this.todos; 
    }, 
Смежные вопросы