Поиск объектов в массивах JavaScript

Как искать свойство объекта в массиве без использования for циклы в JavaScript?

Если массив простой, я могу использовать array.indexOf(value) чтобы получить индекс, но что если массив является массивом объектов? Кроме цикла каким-либо другим способом?

Например, ar = [{x,y},{p,q},{u,v}], Если искали v, он должен вернуть индекс массива как 2.

2 ответа

Решение

Поиск значения в массиве обычно требует последовательного поиска, который требует, чтобы вы перебирали каждый элемент до тех пор, пока не найдете совпадение.

function search(ar, value) {
  var i, j;
  for (i = 0; i < ar.length; i++) {
    for (j in ar[i]) {  
      if (ar[i][j] === value) return i;
    }
  }
}

search([{'x': 'y'}, {'p': 'q'}, {'u': 'v'}], 'v'); // returns 2;

Поиск объектов в массивах JavaScript

javascript:
   /* quick fix naive short solution to be posted soon */
   /* array of objects with primitive property values only and no wrinkles */

,

javascript:
   alert(
      JSON.stringify(
         [{x:1,y:2},,,{p:"q"},{u:{},vx:[],x:{y:{},x:5}}]
             ) . match(/"x":/g)
    )

а также

javascript:   /*  Does the need to fortify this code imply JSON is stronger?  */
   alert(                                             /*  See wrinkles below  */
      [{x:1,y:2},,,{p:"q"},{u:{},vx:[],x:{y:{},x:5}}] . toSource() .
 /*
         match(/({|,)\s*x:/g) . join() . replace(/({|,)\s*x:/g,"x:")
   finds `x:,x:,x:`
 */
         replace(/(({|,)\s*)([^,{:]*):/g,'$1"$3":') . match(/"x":/g)
    )

находить "x":,"x":,"x":,

Конкретная недвижимость найдена, сделка сделана?

Подсказка, подсказка (но должны быть соответствующим образом ослаблены и ампутированы для гнездовых животных):

javascript:
    alert(
        JSON.stringify([{x:1,y:2},{p:"q"},{u:{},v:[],x:{y:{},x:5}}]) . 
             match(/"[^"]*":/g)
    )

находки "x":,"y":,"p":,"u":,"v":,"x":,"y":,"x": (все свойства - Готово сейчас?)

Больше (намного больше) боль напряжения мозга найдет x:значения и индекс позиций массива (верхний уровень подсчета подсказок ,"S).

Подсказка ампутации и ослабления (удаляет только вложенный массив и объект ,х, см морщины):

javascript:debug=false;
   animal=[
      {x:1,y:2},,,{p:"q"},
         [ {u:{},vx:[,,], x:{y:{xx:''},x:5} }, "hmmm comma x colon \" monster" ],
   ];
   animal=animal.toSource().replace(/\[(.*)]/,"$1");
/*  */ if(debug){
   alert(animal);
   animal=animal.replace(/\[([^[\]]*)\]/g,
               function(a,b,c,d){alert([a,b,c,d].join("\n\n"));return a});
   while(animal.search(/\{.*\}|\[.*\]/)>-1){
      animal=animal.replace(/\{([^{}]*)\}|\[(.*)\]/g,
         function(a,b,c,d){alert([a,"\n",b,"\n",c]);return b.replace(/,/g,";")});
      alert(animal); }
/*  */   }

  /* the while loops on nesting depth not top array length */
   while(animal.search(/\{.*\}|\[.*\]/)>-1)
      animal=animal.replace(/\{([^{}]*)\}|\[(.*)\]/g,       /* implicit g loop */
                  function(a,b,c,d){return (b+c).replace(/,/g," ")}); /* ditto */
   alert(animal);    /* as opposed to a non-lert animal? */

Морщины:

  • .toSource() Сильнее (но... см. Выше) и обрабатывает больше ситуаций, чем JSON
    ref: Реализация метода toSource() в Mozilla в Internet Explorer

  • Что делать, если есть монстры со строками, содержащими:
    1. ,х.,, как в.,, [",,or",,{p:"1,2,3,"}]
    2. {x:...} или же {"x":...},,, как в.,, ['{"x":...}'," and ","{x:...}",,]
      (который испортит вышеуказанную кодировку используя JSON или же toSource)
    3. вложенные монстры
    4. другие чудовища - это просто химеры... недостаточно платные, чтобы сделать или доказать
Другие вопросы по тегам