|
172 | 172 | } |
173 | 173 | } |
174 | 174 |
|
| 175 | + function createUpdate(update, data, globalOpertors) { |
| 176 | + let operatorKeys = {} |
| 177 | + if (globalOpertors) |
| 178 | + operatorKeys = { ...globalOpertors } |
| 179 | + |
| 180 | + Object.keys(data).forEach(key => { |
| 181 | + if (key.startsWith('$')) { |
| 182 | + if (!key.includes('.')) |
| 183 | + for (let oldkey of Object.keys(data[key])) |
| 184 | + operatorKeys[key + '.' + oldkey] = data[key][oldkey] |
| 185 | + else |
| 186 | + operatorKeys[key] = data[key] |
| 187 | + } else if (typeof data[key] === 'string' && data[key].startsWith('$')) { |
| 188 | + operatorKeys[data[key] + '.' + key] = data[key] |
| 189 | + } else if (key.endsWith(']')) { |
| 190 | + const regex = /^(.*(?:\[\d+\].*?)?)\[(.*?)\](?:\[\])?$/; |
| 191 | + const match = key.match(regex); |
| 192 | + if (match[2] === '') |
| 193 | + operatorKeys['$push.' + match[1]] = data[key] |
| 194 | + else { |
| 195 | + let index = parseInt(match[2], 10); |
| 196 | + if (index === NaN) |
| 197 | + operatorKeys[match[2] + '.' + match[1]] = data[key] |
| 198 | + else |
| 199 | + operatorKeys[key] = data[key] |
| 200 | + } |
| 201 | + } else if (key.includes('.')) { |
| 202 | + operatorKeys[key] = data[key] |
| 203 | + } else if (data[key] === undefined) { |
| 204 | + delete update[key] |
| 205 | + } else |
| 206 | + update[key] = data[key] |
| 207 | + |
| 208 | + }) |
| 209 | + |
| 210 | + return dotNotationToObjectUpdate(operatorKeys, update) |
| 211 | + } |
| 212 | + |
| 213 | + function dotNotationToObjectUpdate(data, object = {}) { |
| 214 | + try { |
| 215 | + for (const key of Object.keys(data)) { |
| 216 | + let newObject = object |
| 217 | + let oldObject = new Object(newObject) |
| 218 | + let keys = key.replace(/\[(\d+)\]/g, '.$1').split('.'); |
| 219 | + let value = data[key] |
| 220 | + let operator |
| 221 | + if (keys[0].startsWith('$')) |
| 222 | + operator = keys.shift() |
| 223 | + |
| 224 | + let length = keys.length - 1 |
| 225 | + for (let i = 0; i < keys.length; i++) { |
| 226 | + if (/^\d+$/.test(keys[i])) |
| 227 | + keys[i] = parseInt(keys[i]); |
| 228 | + |
| 229 | + if (length == i) { |
| 230 | + if (operator) { |
| 231 | + let operators = ['$rename', '$inc', '$push', '$each', '$splice', '$unset', '$delete', '$slice', '$pop', '$shift', '$addToSet', '$pull'] |
| 232 | + if (!operators.includes(operator)) |
| 233 | + continue |
| 234 | + if (operator === '$rename') { |
| 235 | + newObject[value] = newObject[keys[i]] |
| 236 | + delete newObject[keys[i]] |
| 237 | + } else if (operator === '$delete' || operator === '$unset' || operator === '$slice') { |
| 238 | + if (typeof keys[i] === 'number') |
| 239 | + newObject.slice(keys[i], 1); |
| 240 | + else |
| 241 | + delete newObject[keys[i]] |
| 242 | + } else if (operator === '$shift') { |
| 243 | + newObject[keys[i]].shift(); |
| 244 | + } else if (operator === '$pop') { |
| 245 | + newObject[keys[i]].pop(); |
| 246 | + } else if (operator === '$addToSet') { |
| 247 | + let exists |
| 248 | + if (Array.isArray(value)) { |
| 249 | + exists = newObject[keys[i]].some(item => Array.isArray(item) && isEqualArray(item, value)); |
| 250 | + } else if (typeof value === 'object' && value !== null) { |
| 251 | + exists = newObject[keys[i]].some(item => typeof item === 'object' && isEqualObject(item, value)); |
| 252 | + } else { |
| 253 | + exists = newObject[keys[i]].includes(value); |
| 254 | + } |
| 255 | + if (!exists) |
| 256 | + newObject[keys[i]].push(value) |
| 257 | + } else if (operator === '$pull') { |
| 258 | + if (Array.isArray(value)) { |
| 259 | + newObject[keys[i]] = newObject[keys[i]].filter(item => !Array.isArray(item) || !isEqualArray(item, value)); |
| 260 | + } else if (typeof value === 'object' && value !== null) { |
| 261 | + newObject[keys[i]] = newObject[keys[i]].filter(item => typeof item !== 'object' || !isEqualObject(item, value)); |
| 262 | + } else { |
| 263 | + newObject[keys[i]] = newObject[keys[i]].filter(item => item !== value); |
| 264 | + } |
| 265 | + } else if (operator === '$push' || operator === '$splice') { |
| 266 | + if (typeof keys[i] === 'number' && newObject.length >= keys[i]) |
| 267 | + newObject.splice(keys[i], 0, value); |
| 268 | + else if (newObject[keys[i]]) |
| 269 | + newObject[keys[i]].push(value); |
| 270 | + else |
| 271 | + newObject[keys[i]] = [value]; |
| 272 | + } else if (operator === '$each') { |
| 273 | + if (!Array.isArray(value)) |
| 274 | + value = [value] |
| 275 | + if (typeof keys[i] === 'number') |
| 276 | + newObject.splice(keys[i], 0, ...value); |
| 277 | + else |
| 278 | + newObject[keys[i]].push(...value); |
| 279 | + } else if (operator === '$inc') { |
| 280 | + newObject[keys[i]] += value |
| 281 | + } |
| 282 | + } else if (value === undefined) { |
| 283 | + if (typeof keys[i] === 'number') |
| 284 | + newObject.slice(keys[i], 1); |
| 285 | + else |
| 286 | + delete newObject[keys[i]] |
| 287 | + } else |
| 288 | + newObject[keys[i]] = value; |
| 289 | + } else { |
| 290 | + newObject[keys[i]] = oldObject[keys[i]] || {}; |
| 291 | + newObject = newObject[keys[i]] |
| 292 | + oldObject = oldObject[keys[i]] |
| 293 | + } |
| 294 | + } |
| 295 | + } |
| 296 | + return object |
| 297 | + } catch (error) { |
| 298 | + console.log("Error converting dot notation to object", error); |
| 299 | + return false; |
| 300 | + } |
| 301 | + } |
| 302 | + |
175 | 303 | function domParser(str) { |
176 | 304 | try { |
177 | 305 | var mainTag = str.match(/\<(?<tag>[a-z0-9]+)(.*?)?\>/).groups.tag; |
|
708 | 836 | }); |
709 | 837 | } |
710 | 838 |
|
| 839 | + |
711 | 840 | function getAttributes(el) { |
712 | 841 | if (!el) return; |
713 | 842 |
|
|
776 | 905 | queryData, |
777 | 906 | searchData, |
778 | 907 | sortData, |
| 908 | + createUpdate, |
779 | 909 | getAttributes, |
780 | 910 | setAttributeNames, |
781 | 911 | getAttributeNames |
|
0 commit comments