{"ScriptPreparationCode":"// Sort of like a recursive version of Ramda\u0027s \u0060where\u0060 (http://ramdajs.com/docs/#where).\r\nvar whereAll = R.curry((spec, obj) =\u003E {\r\n if (typeof obj === \u0022undefined\u0022) {\r\n if (spec === null || typeof spec === \u0022boolean\u0022) {\r\n return !spec\r\n }\r\n return false\r\n } else if (spec === false) {\r\n return false\r\n }\r\n var output = true\r\n R.forEachObjIndexed((v, k) =\u003E {\r\n if (v === null || typeof v === \u0022boolean\u0022 || R.keys(v).length) {\r\n if (!whereAll(v, obj[k])) {\r\n output = false\r\n }\r\n } else if (!v(obj[k])) {\r\n output = false\r\n }\r\n }, spec)\r\n return output\r\n})\r\n\r\n// -----------------------------------------------------------------------------\r\n\r\nvar data1 = {\r\n a: {\r\n h: [\r\n { i: 5 },\r\n [\r\n { j: 6, k: 7 },\r\n { j: 8, k: \u0022nine\u0022 },\r\n ],\r\n 10,\r\n { l: { m: { n: false } } },\r\n ],\r\n },\r\n}\r\n\r\nvar data2 = {\r\n a: {\r\n h: [\r\n { i: 5 },\r\n [\r\n { j: 8, k: \u0022nine\u0022 },\r\n ],\r\n ],\r\n },\r\n}\r\n\r\nvar detect1 = R.where({\r\n a: R.where({\r\n h: R.where([\r\n R.always(true),\r\n Array.isArray,\r\n R.complement(R.identical(undefined)),\r\n R.where({ l: R.where({ m: R.where({ n: R.complement(R.identical(undefined)) }) }) }),\r\n ]),\r\n }),\r\n})\r\n\r\nvar detect2 = whereAll({\r\n a: {\r\n h: [\r\n R.always(true),\r\n Array.isArray,\r\n R.complement(R.identical(undefined)),\r\n { l: { m: { n: R.complement(R.identical(undefined)) } } },\r\n ],\r\n },\r\n})\r\n\r\nvar detect3 = whereAll({\r\n a: {\r\n h: [\r\n null,\r\n Array.isArray,\r\n true,\r\n { l: { m: { n: true } } },\r\n ],\r\n },\r\n})\r\n","TestCases":[{"Name":"Using \u0060R.where\u0060","Code":"detect1(data1)\r\ndetect1(data2)\r\n","IsDeferred":false},{"Name":"Using \u0060whereAll\u0060","Code":"detect2(data1)\r\ndetect2(data2)\r\n","IsDeferred":false},{"Name":"Using \u0060whereAll\u0060 (alternate)","Code":"detect3(data1)\r\ndetect3(data2)\r\n","IsDeferred":false}]}