У меня есть массив объектов, например.
var arr = [
{"a": "x"},
{"b": "0"},
{"c": "k"},
{"a": "nm"},
{"b": "765"},
{"ab": "i"},
{"bc": "x"},
{"ab": "4"},
{"abc": "L"}
];
Допустим, меня интересуют только объекты, ключи которых соответствуют var input = ["ab", "bc"]
. Это означает, что я хочу извлечь все возможные подмассивы с result[i].length == 2
следующим образом:
var result = [
[{"ab": "i"}, {"bc": "x"}],
[{"ab": "4"}, {"bc": "x"}] // or [{"bc": "x"}, {"ab": "4"}]
];
— то есть порядок объектов в подмассивах абсолютно не важен: меня интересует только то, что каждый подмассив содержит два объекта — {"ab": ...}
и {"bc": ...}
.
Если бы меня интересовал var input = ["a","a","ab"]
, результат должен быть таким:
var result = [
[{"a": "x"}, {"a": "nm"}, {"ab": "i"}],
[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]
];
Я не могу найти способ добиться желаемого результата (при условии, что input.length
может быть намного больше, чем 2 или 3 — даже 15–20 может быть недостаточно) без объема вычислений на уровне факториала, что физически невозможно. Есть ли способ получить приемлемую производительность для решения такой задачи?
Важное примечание: да, очевидно, что для относительно больших значений input.length
теоретически возможно иметь очень большое количество возможных комбинаций, но на практике result.length
всегда будет достаточно мало (может быть, 100–200, я даже сомневаюсь, что может достигать 1000...). Но для безопасности я хотел бы просто установить какой-то предел (скажем, 1000), чтобы, как только result.length
достигает этого предела, функция просто возвращала текущий result
и останавливалась.
arr
{"ab":value}
. Если да, возьмите следующий{"bc":value}
и поместите их оба вresult
. Шаг 2. проверьте, содержит лиarr
{"bc":value}
. Если да, возьмите следующий{"ab":value}
и поместите их оба вresult
. И так далее, для чего требуется число возможных ситуаций факторного уровня. - person lyrically wicked   schedule 03.10.2016["a", "a", "ab"]
? Как алгоритм должен решить, является ли значение частью первого a или второго? Сначала отсканируйтеinput
, а затем решите, что a больше 1, последний должен получить остальные? Или, возможно, вы действительно искали произведение найденных объектов для каждого ключа? - person Ilja Everilä   schedule 03.10.2016result[i+1]
отresult[i]
? да. Вот что важно. - person lyrically wicked   schedule 03.10.2016[{"a": "nm"}, {"a": "x"}, {"ab": "4"}]
не уникален по сравнению с[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]
и[{"a": "x"}, {"a": "nm"}, {"ab": "i"}]
, или вас не интересует порядок? Какой должен быть вывод, если объектов с ключом a было более 2-х? Вы ищете набор наборов отфильтрованных значений? - person Ilja Everilä   schedule 03.10.2016[{"a": "nm"}, {"a": "x"}, {"ab": "4"}]
и[{"a": "x"}, {"a": "nm"}, {"ab": "4"}]
, они будут представлять одни и те же данные и станут дубликатами. После этого вы сможете найти все дубликаты[{"a": "x"}, {"a": "nm"}, {"ab": "i"}]
, но в любом случае вы не сможете извлечь более 2 массивов с уникальными данными из заданного источника. - person lyrically wicked   schedule 04.10.2016["a", "a", "ab"]
, аarr
содержит только 1 объект. Было бы это пустым набором, поскольку можно было бы произвести только[{"a": "x"}, {"a": "x"}, ...]
. - person Ilja Everilä   schedule 04.10.2016arr
содержит не менее двух{"a": ...}
объектов и один объект{"ab": ...}
. Но на практике мне такая дополнительная проверка даже не понадобится. И конкретные детали того, что может быть результатом, еслиarr
не соответствуетinput
, не важны. Мы можем просто вернуть пустой массив. - person lyrically wicked   schedule 04.10.2016