Преобразовывать Array Объектов JavaScript

Вы нуждались бы в том, чтобы преобразовать возвращенный объект вызова AJAX в другой объект с различными свойствами.

У объекта в вопросе есть структура, сходная с этой:

[
    {
        campo1: "algun valor",
        campo2: { Id: 12345567, Nombre: "Algun otro dato" },
        campo3: { Id: 12345567, Nombre: "Algun otro dato" },
        campo4: { Nombre: "Algun otro dato", Valor: 23456678 },
        campo5: { Id: 12345567, Nombre: "Algun otro dato" },
        campo6: false
    },
    {
        campo1: "algun valor x",
        campo2: { Id: 12345567, Nombre: "Algun otro dato" },
        campo3: { Id: 12345567, Nombre: "Algun otro dato" },
        campo4: { Nombre: "Algun otro dato 2", Valor: 234566789 },
        campo5: { Id: 1234557, Nombre: "Algun otro datx" },
        campo6: true
    }, 
]

И мне нужно, чтобы осталось нечто похожее:

{
    campo2: [
        { Id: 12345567, Nombre: "Algun otro dato" }
    ],
    campo3: [
        { Id: 12345567, Nombre: "Algun otro dato" }
    ],
    campo4: [
        { Nombre: "Algun otro dato", Valor: 23456678 },
        { Nombre: "Algun otro dato 2", Valor: 234566789 }
    campo5: [
        { Id: 12345567, Nombre: "Algun otro dato" },
        { Id: 1234557, Nombre: "Algun otro datx" }
    ]
}

Я попробовал использовать какие-то из функций верхнего порядка, но Вы замечаете, что я испытываю недостаток в знании, потому что мне не удается дать в гвозде. В конечном счете, я пробую создавать набор dropdown так что я остался:

<select id="campo2">
    <option value="12345567">Algun otro dato</option>
</select>
<select id="campo3">
    <option value="12345567">Algun otro dato</option>
</select>
<select id="campo4">
    <option value="23456678">Algun otro dato</option>
    <option value="234566789">Algun otro dato 2</option>
</select>
<select id="campo5">
    <option value="12345567">Algun otro dato</option>
    <option value="1234557">Algun otro datx</option>
</select>

Вы замечаете: Нужно отмечать, что я не рассказываю с информацией, что Вы приходите из так называемого AJAX, то есть я не знаю ни значений, которые у Вас есть, ни, ни сколько полей, ни какие поля. Главным образом - произведенные поля dinámicamente с базы данных.

Вы замечаете 2: Если они обращают внимание, поля, принесенные во втором объекте выданы:

  • Не значения, которые не объекты.
  • Не повторенные объекты.
  • Нет двух (или больше) объекты родители.

Издание 1: В ответе в @a-cedano, второй JSON произведен согласно предыдущим превращениям, ввиду следующих рассуждений:

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

Каковой была бы лучшая (или какая-то) способом это противостоять? Я предполагаю, что используя эти функции верхнего порядка (добро).

Я попробовал что-то вроде следующее (подобно тесту), но еще Вы не последовали мне:

    	let data = [
		{
			campo1: "algun valor",
			campo2: { Id: 12345567, Nombre: "Algun otro dato" },
			campo3: { Id: 12345567, Nombre: "Algun otro dato" },
			campo4: { Nombre: "Algun otro dato", Valor: 23456678 },
			campo5: { Id: 12345567, Nombre: "Algun otro dato" },
			campo6: false
		},
		{
			campo1: "algun valor x",
			campo2: { Id: 12345567, Nombre: "Algun otro dato" },
			campo3: { Id: 12345567, Nombre: "Algun otro dato" },
			campo4: { Nombre: "Algun otro dato 2", Valor: 234566789 },
			campo5: { Id: 1234557, Nombre: "Algun otro datx" },
			campo6: true
		}, 
	];

	 const datos = [];
	 data.forEach(d => {
	   for(var prop in d) {
		if(typeof d[prop] === 'object') {
		  let match = datos.find(x => Object.keys(x).indexOf('prop'));
			if(datos.length < 1 || match < 0)
			datos.push({ [prop]: d[prop] });
		  else {
		   if(datos[prop])
			 datos[prop].push(d[prop]);
		 }
		}
	   }
	 });
   console.log(datos)

Я благодарен за любой конструктивный комментарий.

5
задан 26.07.2019, 22:54
3 ответа

Возможная одна soluciГіn podrГ, - чтобы быть используя reduce() и some()

const array = [{campo1: "algun valor",campo2: { Id: 12345567, Nombre: "Algun otro dato" },campo3: { Id: 12345567, Nombre: "Algun otro dato" },campo4: { Nombre: "Algun otro dato", Valor: 23456678 },campo5: { Id: 12345567, Nombre: "Algun otro dato" },campo6: false},{campo1: "algun valor x",campo2: { Id: 12345567, Nombre: "Algun otro dato" },campo3: { Id: 12345567, Nombre: "Algun otro dato" },campo4: { Nombre: "Algun otro dato 2", Valor: 234566789 },campo5: { Id: 1234557, Nombre: "Algun otro datx" },campo6: true}]

const resultado = array.reduce((p,c)=>{
    for(let prop in c){
        if(typeof c[prop] === 'object')
        if(prop in p){
            if(!p[prop].some(e=>JSON.stringify(e) === JSON.stringify(c[prop]))) 
            p[prop].push(c[prop]);
        }else{
            p[prop] = [c[prop]];
        }
    }
    return p;
},{});

console.log(resultado);

Сравнивать объекты con JSON.stringify(e) === JSON.stringify(c[prop] не идеальное, если ты хочешь немного идеальный tendrГ-туз, который должен повторять и сравнивать ключ с ключом и стоимость со стоимостью.

такие как @RubГ©n seГ±ala в комментариях, я иду описывать как можно более кратко, потому что JSON.stringify(objetoA) === JSON.stringify(objetoB) не идеальное.

, Если мы сравниваем эти два объекта, нет сомнения в том, что они равны:

var foo = { a: 1, b:2 };
var bar = { a: 1, b:2  };

console.log(JSON.stringify(foo) === JSON.stringify(bar)) 

, но если мы меняем порядок:

var foo = { a: 1, b:2 };
var bar = { b:2, a: 1  };

console.log(JSON.stringify(foo) === JSON.stringify(bar)) 

Дает false, что происходит, состоит в том, что исторически объекты javascript не обязательно упорядочены из-за нее especificaciГіn языка. Так что эти два объекта - tГ©cnicamente равные, но не существует один mГ©todo родной, чтобы это проверять. Начиная с нее especificaciГіn ES2015 осуществления языка должны поддерживать порядок insersiГіn, exepto, если key могут быть parceados в целые числа как "1", "5" и т.д. Тогда в этом случае два объекта наверху - distГ-ntos.

А именно: в teorГ - в браузеры они должны поддерживать порядок insersiГіn, если давайте верить с тем же порядком insersiГіn deberГ-an, что два объекта смогли быть сравнимыми (каждый раз, когда мы не использовали "1", "3", "30" как key), потому что браузер mantendrГ - в порядок, в этом случае serГ - со страховкой использовать JSON.stringify. То, что происходит, состоит в том, что какие-то mГ©todos браузеров сегодня в dГ - в 07/19, они меняют порядок свойств объектов. SerГ - в inГєtil, что поместил acГЎ примеры, потому что он меняется постоянно, Гєltimo, который tenГ - в известие был sort () в chrome. К этому изменению в порядке отнеслись в свою очередь как вирус в браузерах, из-за которого предполагается, что в будущем они будут гарантировать порядок.

, Добавленный к этой проблеме, сравнивать два основных объекта с ключом и стоимость со стоимостью достаточно сложная, потому что у нас может быть n уровней и эти уровни могут быть другими объектами или arrays пример . Как conclusiГіn, сегодня идеальное serГ, - чтобы делать один mГ©todo especГ-fico, чтобы сравнивать два объекта (ключ с ключом и стоимостью со стоимостью) каждый раз, когда мы узнали структуру, а serГ, - чтобы лучше стараться не использовать объекты, если мы нуждаемся в том, чтобы сравнить их.

3
ответ дан 03.12.2019, 01:34
  • 1
    Твой вопрос serí в лучше, если ты объяснишь кратко, потому что это использованное в твоем ответе это не идеальное. –  Rubén 26.07.2019, 20:51
  • 2
    @Rubé n, если уже, я это не объясняю, потому что он достаточно длинный, также я попробую делать резюме. –  Emeeus 26.07.2019, 20:53
  • 3
    Quizá s, с которым упоминания, которые оно функционирует хорошо со свойствами, которые они считают примитивной стоимостью, но не, когда это объекты уже serí в лучшее достаточно твой ответ и todaví в лучше, если ты включаешь ссылку в вопрос или ссылку с explicació n расширь. –  Rubén 26.07.2019, 21:00

Эта тот versiГіn.

const data = [
    {
        campo1: "algun valor",
        campo2: { Id: 12345567, Nombre: "Algun otro dato" },
        campo3: { Id: 12345567, Nombre: "Algun otro dato" },
        campo4: { Nombre: "Algun otro dato", Valor: 23456678 },
        campo5: { Id: 12345567, Nombre: "Algun otro dato" },
        campo6: false
    },
    {
        campo1: "algun valor x",
        campo2: { Id: 12345567, Nombre: "Algun otro dato" },
        campo3: { Id: 12345567, Nombre: "Algun otro dato" },
        campo4: { Nombre: "Algun otro dato 2", Valor: 234566789 },
        campo5: true,
        campo6: { Id: 1234557, Nombre: "Algun otro datx" }
    },
];

const existingId = (obj1, obj2) => {
    return obj1.Id ? //Si obj1 tiene Id se compara Id, de lo contrario se compara Valor
        (obj1.Id === obj2.Id || obj1.Id === obj2.Valor) :
        (obj1.Valor === obj2.Id || obj1.Valor === obj2.Valor)
};

const resultObject = {};
data.forEach(lista => {
    Object.keys(lista).forEach(campoName => {//Se itera por cada llave del objeto
        if (lista[campoName] && lista[campoName].Nombre && (lista[campoName].Id || lista[campoName].Valor)) { //Se verifica que sea un objeto apto
            if (!resultObject[campoName]) { //Se verifica si el objeto ya tiene una llave con el mismo nombre
                resultObject[campoName] = []; //Se asigna si no existe
            }
            if (!resultObject[campoName].find(campo => existingId(campo, lista[campoName]))) { //Verificamos que el array de cada campo no contenga ya un Id o un Valor igual
                resultObject[campoName].push(lista[campoName])//Si no hay un Id o un Valor existente, agregamos al array
            }
        }
    });
});

console.log(resultObject);

Пример https://jsbin.com/detaxoqabo/edit? js, я утешил

Главным образом первый фильтр подходящие объекты, потом я верю в элемент array в конечном объекте, если он состоит в том, что не существует элемент с тем же ключом. В конце концов я добавляю мой элемент к объективному array, после проверяя, что у этого array не было элементов с одним, Пойдите или Стоимость будь равен в элемент, который я хочу добавить.

1
ответ дан 03.12.2019, 01:34

Ты был близко, проблема, что солитеры это, сравнив объект, который ты повторяешь меняя эту форму, (и if((typeof d[prop] === 'object' ), что идеальный - тот, который не, что он произошел так, ты улучшаешь немного больше времени) также для compara весь объект или примитивный дебет использовать mГ©todo JSON.stringify () ;

В continuaciГіn cГіdigo

let data = [{
  campo1: "algun valor",
  campo2: { Id: 12345567, Nombre: "Algun otro dato" },
  campo3: { Id: 12345567, Nombre: "Algun otro dato" },
  campo4: { Nombre: "Algun otro dato", Valor: 23456678 },
  campo5: { Id: 12345567, Nombre: "Algun otro dato" },
  campo6: false
},{
  campo1: "algun valor x",
  campo2: { Id: 12345567, Nombre: "Algun otro dato" },
  campo3: { Id: 12345567, Nombre: "Algun otro dato" },
  campo4: { Nombre: "Algun otro dato 2", Valor: 234566789 },
  campo5: { Id: 1234557, Nombre: "Algun otro datx" },
  campo6: true
}];
const datos = {};
data.forEach((d )=> {
  for(var prop in d) {
    if(!(typeof d[prop] === 'object')) continue;
    if(!datos[prop]){
     datos[prop] = [d[prop]]
    }else{
      if( !datos[prop].some(e=>JSON.stringify(e) === JSON.stringify(d[prop]))){
      datos[prop].push(d[prop]);
      }
    } 

  }

});
   console.log(datos)
0
ответ дан 03.12.2019, 01:34