JSFiddle - React, Tailwind, and code Playground

by neonDog

JavaScript

const isNumeric = function (n) {
	return !isNaN(parseFloat(n)) && isFinite(n);
};

const createPatchPathNotExist = function(obj, path, seperator, patch=[]) {
	//path = pathToArray(path, seperator);
	const pathCopy = [];
  
  let index = 0;
	const length = path.length;

	if (length === 0) {
		return obj;
	}

	while (obj != null && index < length) {
		obj = obj[path[index++]];
    pathCopy.push(path[index]);
	}
  
  //Whole path exists
  if (index && index === length) return patch;
	
  console.warn('Whole patch does not exist yet');
  
	for (let i=index; i < length; i++) {
		const nextPath = path[i + 1];
    const isArray = isNumeric(nextPath) || nextPath === '-';
    const value = isArray ? [] : {};
		patch.push({op:'add', path: pathCopy, value});
	}

}


const obj = {
	'fuck':{
  	'rabbit':{}
  }
};


console.error(createPatchPathNotExist(obj, ['fuck', 'rabbit', 'sugar', '-']));

console.error(createPatchPathNotExist(obj, ['duck', 'rabbit', '-', 'bitch']));