Я не думаю, что вопросник касается только одного вложенного объекта уровня, поэтому я представляю следующую демонстрацию, чтобы продемонстрировать, как получить доступ к узлу глубоко вложенного объекта json. Хорошо, давайте найдем узел с идентификатором '5'.
var data = {
code: 42,
items: [{
id: 1,
name: 'aaa',
items: [{
id: 3,
name: 'ccc'
}, {
id: 4,
name: 'ddd'
}]
}, {
id: 2,
name: 'bbb',
items: [{
id: 5,
name: 'eee'
}, {
id: 6,
name: 'fff'
}]
}]
};
var jsonloop = new JSONLoop(data, 'id', 'items');
jsonloop.findNodeById(data, 5, function(err, node) {
if (err) {
document.write(err);
} else {
document.write(JSON.stringify(node, null, 2));
}
});
<script src="https://rawgit.com/dabeng/JSON-Loop/master/JSONLoop.js"></script>
Существует довольно распространенный метод псевдо-COUNTUNIQUE¹ на основе функций SUMPRODUCT и COUNTIF , которые выглядят следующим образом.
=SUMPRODUCT(1/COUNTIF(A2:A19, A2:A19&""))
Но это компенсирует условия. Чтобы добавить условия, вам нужно перейти на функцию COUNTIFS . Кроме того, как числитель, так и знаменатель операции деления должны быть скорректированы условиями и инверсией условий, чтобы вы вернули истинный счетчик без ошибок с помощью #DIV/0!
.
=SUMPRODUCT(((C$2:C$19>=F2)*(C$2:C$19<=G2)*($B$2:$B$19=E2))/
(COUNTIFS(A$2:A$19, A$2:A$19&"", C$2:C$19, ">="&F2, C$2:C$19, "<="&G2, $B$2:$B$19, E2)+
(C$2:C$19<F2)+(C$2:C$19>G2)+($B$2:$B$19<>E2)))
Теперь, когда формула трудно поддерживать, существуют постоянные добавления и удаления к числу строк. Чтобы создать динамические диапазоны, мы можем INDEX каждый полный столбец и использовать MATCH , чтобы найти последнюю дату в качестве терминатора для каждого столбца.
=SUMPRODUCT(((C$2:INDEX(C:C, MATCH(1E+99,C:C ))>=F2)*(C$2:INDEX(C:C, MATCH(1E+99,C:C ))<=G2)*($B$2:INDEX(B:B, MATCH(1E+99,C:C ))=E2))/
(COUNTIFS(A$2:INDEX(A:A, MATCH(1E+99,C:C )), A$2:INDEX(A:A, MATCH(1E+99,C:C ))&"", C$2:INDEX(C:C, MATCH(1E+99,C:C )), ">="&F2, C$2:INDEX(C:C, MATCH(1E+99,C:C )), "<="&G2, B$2:INDEX(B:B, MATCH(1E+99,C:C )), E2)+
(C$2:INDEX(C:C, MATCH(1E+99,C:C ))<F2)+(C$2:INDEX(C:C, MATCH(1E+99,C:C ))>G2)+($B$2:INDEX(B:B, MATCH(1E+99,C:C ))<>E2)))
Да, это похоже на беспорядок, но он динамически добавляет и вычитает строки, обработанные функцией SUMPRODUCT, так что эффективность вычислений превзойдена.
¹ Для объяснения того, как это работает, см. Count Unique с SUMPRODUCT () Breakdown .
Формула работает с несколькими настройками:
Ниже приведена модифицированная версия:
= FREQUENCY ( ЕСЛИ (Международный М2: М1000 & л; = ДАТАЗНАЧ ( "6/1/2016"), ЕСЛИ (Международный М2: М1000> = ДАТАЗНАЧ ( "3/23/2013"), ЕСЛИ (Международный I2:! i1000 & л;>» »IF (International I2: i1000 & л;>! "Digital", MATCH (International A2:! A1000, Международный A2: A1000,0), 0)!))), ROW (International A2: A1000) -строка (International ! А2) +1> 0)