Перебрать дерево и нажать все свойства в массиве

var obj = {
    x1: {
        x2: {
            x3: {
                condition: false,
                condition_trust: 55.25,
                condition_2 : true,
                condition
array = [
x1_x2_x3_condition : false,
x1_x2_x3_condition_trust : 55.25,
x1_x2_x3_condition_2 : true,
x1_x2_x3_condition_2_trust : 55.456,
x4_name : "aaa",
x4_name_trust : 55.25,
x4_name_2 : "bbb",
x4_name_2_trust : 96.42
]
trust: 56.456 } }, x4: { name: "aaa", name_trust: 55.25, name_2: "bbb", name
array = [
x1_x2_x3_condition : false,
x1_x2_x3_condition_trust : 55.25,
x1_x2_x3_condition_2 : true,
x1_x2_x3_condition_2_trust : 55.456,
x4_name : "aaa",
x4_name_trust : 55.25,
x4_name_2 : "bbb",
x4_name_2_trust : 96.42
]
trust: 96.42 } } }

У меня есть такое дерево, оно сложнее, глубже и больше. Свойства всегда находятся на последнем уровне.

То, что я пытаюсь сделать, это получить все свойства с их значениями и поместить их в новый массив. В основном я пытаюсь получить такой массив:

array = [
x1_x2_x3_condition : false,
x1_x2_x3_condition_trust : 55.25,
x1_x2_x3_condition_2 : true,
x1_x2_x3_condition_2_trust : 55.456,
x4_name : "aaa",
x4_name_trust : 55.25,
x4_name_2 : "bbb",
x4_name_2_trust : 96.42
]

Я понятия не имею, с чего начать. Есть идеи?


person Alexandru    schedule 05.04.2017    source источник
comment
Разве не должно быть x1_x4?   -  person kind user    schedule 05.04.2017
comment
Желаемый результат не является допустимым JavaScript.   -  person trincot    schedule 05.04.2017
comment
@trincot, цель обмана уродлива и не помогает.   -  person Nina Scholz    schedule 06.04.2017
comment
@Alexandru: Создайте функцию, которая получает объект o и строку s. При первом вызове передайте o основной объект и s пустую строку. В функции создайте результат вида var res = {}. Затем повторите o, используя цикл for (var k in o) {...}. В цикле проверьте if (typeof o[k] === "object") и, если это так, сделайте рекурсивный вызов вашей функции с объектом o[k] и с s + k + "_", возьмите его результат и выполните Object.assign(res, nestedRes). Если это был не объект, то просто присвойте o[k] s + k объекту res. После цикла return res.   -  person    schedule 06.04.2017
comment
@NinaScholz, но упомянутый вопрос касается того же (сглаживания объекта), что имеет значение, не так ли? Если у кого-то есть лучший и более чистый ответ, то почему бы не опубликовать его там?   -  person trincot    schedule 06.04.2017


Ответы (1)


В основном вам нужно сгладить объект? если да то вот решение

var obj = {
  x1: {
    x2: {
      x3: {
        condition: false,
        condition_trust: 55.25,
        condition_2: true,
        condition_2_trust: 56.456
      }
    },
    x4: {
      name: "aaa",
      name_trust: 55.25,
      name_2: "bbb",
      name_2_trust: 96.42
    }
  }
}

function flattenObject(obj) {
  return Object.keys(obj).reduce(function(a, k) {
    if (obj[k].constructor === Object) {
      var o = flattenObject(obj[k]);
      Object.keys(o).forEach(function(key) {
        a[k + '_' + key] = o[key];
      });
    } else {
      a[k] = obj[k];
    }
    return a;
  }, {});
}

console.log(flattenObject(obj));

person ajai Jothi    schedule 05.04.2017
comment
Да, это то, что я хотел. Спасибо, сэр! - person Alexandru; 06.04.2017