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