Я использую Extendscript, который использует ECMAScript 3. Поэтому я ограничен многими ограничениями. Я ищу что-то похожее на Arr.find(func), но доступное для ECMA3. Потому что мне нужен метод, который ищет массив объектов и находит один объект, который имеет определенное значение в одном из его свойств. Поэтому я нашел Arr.indexOf(), который является ECMA3, но не уверен, как использовать его с функцией, так как этот метод работает с массивом строк.

Мой вопрос: есть ли способ использовать .indexOf () с функцией (например, .find()), чтобы она работала с объектами или любым другим решением?

Спасибо

0
HTN3D 2 Мар 2018 в 22:20

3 ответа

Лучший ответ

.indexOf() вам здесь не поможет, потому что он ищет только массивы. Вам нужно искать объекты внутри массива, поэтому вам нужно будет перебирать объекты и пытаться найти совпадения вручную.

var objArray = [
  {key1: "foo", key2: true, key3: 10 },
  {key1: "foo2", key2: false, key3: 100 },  
  {key1: "foo3", key2: true, key3: 101, key4: 101 }
];

function findKey(ary, findVal){
  // Loop over the array
  for(var i = 0; i < ary.length; i++){
  
    // Loop over objects keys
    for(var key in ary[i]){
      // Compare current key value against passed value to find
      if(ary[i][key] === findVal){
         console.log(findVal + " was found in object: " + i + ", key: " + key);
      }
    }      
  }
}

findKey(objArray, 101);
findKey(objArray, true);
1
Scott Marcus 2 Мар 2018 в 20:23

findIndex является функцией Array это берет функцию вместо значения, но дает индекс. Я не знаком с ExtendScript, но на этой странице разработчика Mozilla есть полифилл, который можно добавить. Если есть map и find, то findIndex также может быть там, но вы также можете комбинировать map и indexOf со следующим способом для одного лайнера.

var people = [{name: 'bob', age: 25}, {name: 'mary', age: 5}]
var index = people.map(p => p.name).indexOf('bob')
0
mpartan 2 Мар 2018 в 19:33

Большое спасибо за все ответы. Все они были полезны для меня. Я использовал эту функцию, основываясь на предложении Скотта Маркуса:

  function findItem(list){
    for (var i=0; i < list.length; i++){
      if (list[i].property === true){return i}
    }
  }
0
HTN3D 2 Мар 2018 в 21:56