Переименовать ключи в объекте, содержащем дочерние объекты - PullRequest
0 голосов
/ 07 мая 2020

Я хочу переименовать ключи в объекте, который содержит дочерние объекты, которые выглядят одинаково.

Это мой начальный объект:

objs = {
   "one":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   },
   "two":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   }
}

, и я хочу, чтобы он преобразовал его в это:

objs = {
   "one":{
      "text":"bla",
      "amount":5,
      "items":[
         {
            "text":"bla",
            "identifier":"some text"
         },
         {
            "text":"bla2",
            "identifier":"some text2"
         }
      ]
   },
   "two":{
      "text":"bla",
      "amount":5,
      "items":[
         {
            "text":"bla",
            "identifier":"some text"
         },
         {
            "text":"bla2",
            "identifier":"some text2"
         }
      ]
   }
}

Итак, в основном я хочу переименовать каждый ключ children в items и каждый ключ title в text, независимо от того, насколько глубоко дочерние объекты объекта go. Я уже пробовал использовать spread & Destructuring Assignment в циклах foreach, но это не сработало ..

Ответы [ 4 ]

1 голос
/ 07 мая 2020

Может быть так:

var objs = {
   "one":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   },
   "two":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   }
};



function transorm_obj(_obj){
	var out = [];
	for(var key in _obj){
		var new_obj = {};
		for(var prop in _obj[key]){
		  if(prop == 'children'){
            new_obj['items'] = transorm_obj(_obj[key][prop]);
		  }else if(prop == 'title'){
             new_obj['text'] = _obj[key][prop];
		  }else{
		  	new_obj[prop] = _obj[key][prop];
		  }

        }
        out.push(new_obj);
	}
	return out;
}

console.log(transorm_obj(objs));
0 голосов
/ 07 мая 2020

Вот общая c рекурсивная map функция, которую я написал в недавнем ответе -

const map = (fk = identity, fv = identity, x = null) =>
  Array.isArray(x)
    ? x.map(v => map(fk, fv, v))
: Object(x) === x
    ? Object.fromEntries(
        Object.entries(x).map(([ k, v ]) =>
          [ fk(k)
          , map(fk, fv, v)
          ] 
        )
      )
: fv(x)

Функции высшего порядка особенно полезны, потому что их можно использовать в много практических способов -

const keyReplacer = (k = "") =>
{ if (k === "title") return "text"
  if (k === "children") return "items"
  else return k
}

const objs = // <-- don't forget const keyword
  { ... }

const result =
  map(keyReplacer, identity, objs)

// => ... 

Запустите приведенный ниже фрагмент, чтобы увидеть результат -

const identity = x =>
  x
  
const map = (fk = identity, fv = identity, x = null) =>
  Array.isArray(x)
    ? x.map(v => map(fk, fv, v))
: Object(x) === x
    ? Object.fromEntries(
        Object.entries(x).map(([ k, v ]) =>
          [ fk(k)
          , map(fk, fv, v)
          ] 
        )
      )
: fv(x)

const objs = // <-- don't forget const keyword
  {one:{title:"bla",amount:5,children:[{title:"bla",identifier:"some text"},{title:"bla2",identifier:"some text2"}]},two:{title:"bla",amount:5,children:[{title:"bla",identifier:"some text"},{title:"bla2",identifier:"some text2"}]}}

const keyReplacer = (k = "") =>
{ if (k === "title") return "text"
  if (k === "children") return "items"
  else return k
}

const result =
  map(keyReplacer, identity, objs)

console.log(result)

Очевидным улучшением этого является замена линейного if стека логарифмическим c поиском по словарю -

const keyReplacer = (dict = {}) => (k = "") =>
{ const r = dict[k]
  return r === undefined ? k : r
}

const replacements = 
  { title: "text", children: "items" }

const result =
  map(keyReplacer(replacements), identity, objs)
0 голосов
/ 07 мая 2020

Невозможно переименовать, но вы можете переназначить значение следующим образом:

Object.keys(objs)
    .filter(key => objs[key].children)
    .forEach(key => { 
        objs[key].items = objs[key].children; 
        delete objs[key].children; 
    });
0 голосов
/ 07 мая 2020

Значит, вы хотите переименовать children в items? Вот один из вариантов использования for in l oop для «переименования» вашей собственности.

const objs = {
   "one":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   },
   "two":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   }
};


for (const obj in objs) {
  objs[obj].items = objs[obj].children;
  delete objs[obj].items;
}

console.log(objs);

Или

const objs = {
   "one":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   },
   "two":{
      "title":"bla",
      "amount":5,
      "children":[
         {
            "title":"bla",
            "identifier":"some text"
         },
         {
            "title":"bla2",
            "identifier":"some text2"
         }
      ]
   }
};

const newObjs = Object.keys(objs).reduce( (acc, curr) => {
  const updatedObj = { ...objs[curr], items: objs[curr].children };
  delete updatedObj.children
  acc[curr] = { ...updatedObj };
  return acc;
}, {});

console.log(newObjs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...