Присоединение (';') к вложенному объекту - PullRequest
3 голосов
/ 28 июня 2019

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

obj = { 
    name: "one"
    additionalInfo: "hello"
    ...
};

Object.values(obj).join(';')

Результат: один; привет

Но если объект является вложенным:

obj = { 
    name: "one"
    additionalInfo: {
         description: "hello",
         ...
    }
};

Object.values(obj).join(';')

Результат: один; [объект Объект]

Остальные значения, кроме имени, являются, конечно, [объект Объект].Как я могу присоединиться к значениям уровня 2?

Результат, который я хочу получить:

one;hello

Ответы [ 8 ]

1 голос
/ 28 июня 2019

для более чем одного уровня вы можете сделать это:

var obj = { 
    name: "one",
    additionalInfo: {
         description: "hello",
         yes : 'world'
    }
};

function join(obj) {
  var arr = [];
  for(let key in obj) {
       typeof obj[key] == 'object'? arr.push(Object.values(obj[key])):arr.push(obj[key])
  }
  return arr.join(';')
}


console.log(join(obj))
1 голос
/ 28 июня 2019

Для достижения ожидаемого результата используйте нижеприведенную опцию изменения объекта в строку и найдите значения, используя : и }

  1. Измените obj на строку, используя JSON.stringify и разделить на ": "
  2. Получение слов между ": " и ", " изакрывающие слова между ": " и "} "
  3. Удаление ненужных символов с использованием repalce

пример рабочего кода и добавление еще нескольких объектовдля тестирования

obj = { 
    name: "one",
    additionalInfo: {
         description: "hello",
    },
    test: "abc",
    grandparent: {
      parent: {
        child: "child"
      }
    }
};

function concatObj(obj){
  let str = JSON.stringify(obj).split(":");
  return str.map(v => v.substr(0, v.indexOf(",")) || v.substr(0, v.indexOf("}"))).filter(Boolean).join(":").replace(/"|}|{/g,'')  
}

console.log(concatObj(obj))

codepen - https://codepen.io/nagasai/pen/pXpwdM?editors=1010

1 голос
/ 28 июня 2019

Вы можете использовать рекурсивный подход, убедившись, что преобразовали все вложенные объекты перед объединением значений всего уровня объекта:

function joinObjectValues(obj, delimiter = ";") {
  return Object.values(obj)
    .map(val => {
      //convert any objects recursively
      if (typeof val === "object") {
        return joinObjectValues(val, delimiter);
      }

      return val;
    })
    .join(delimiter)
}

let objOneLevel = {
  name: "one"
};

let objTwoLevels = {
  name: "one",
  additionalInfo: {
    description: "hello",
  }
};

let objThreeLevels = {
  name: "one",
  additionalInfo: {
    description: "hello",
    other: {
      customField: "world"
    }
  }
};


console.log(joinObjectValues(objOneLevel))
console.log(joinObjectValues(objTwoLevels))
console.log(joinObjectValues(objThreeLevels))
1 голос
/ 28 июня 2019

Вы можете использовать рекурсивную функцию и перебирать все свойства следующим образом:

var obj = { 
    name: "one",
    additionalInfo: {
         description: "hello",
    }
};
var val = [];
function getValue(obj){
  for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
      if (typeof obj[property] == "object") {
        getValue(obj[property]);
      } else {
        val.push(obj[property]);          
      }
    }
  }
  return val.join(';');
}
var r = getValue(obj);

console.log(r)
0 голосов
/ 28 июня 2019

Использование рекурсии -

let objValues = [];
    function getObjValues(obj) {
        const objValuesArray = Object.values(obj);
        objValuesArray.forEach((objVal) => {
            if(typeof objVal === 'object') {
                getObjValues(objVal);
            } else {
                 objValues.push(objVal);
            }
        });
      return objValues.join(';');
    }

  const obj = {
            name: "one",
            additionalInfo: "hello",
            newObject: {
                newname: "two",
                info: "news"
            }
        }; 

const concatenatedValues = getObjValues(obj);
console.log(concatenatedValues);
0 голосов
/ 28 июня 2019

Делать это с рекурсивной функцией?

const obj = {
  name: "one",
  additionalInfo: {
    description: "hello",
  }
};


const mapped = flatObject(obj).flat().join(';')

console.log(mapped)


// this is a recursive function
function flatObject(obj) {
  const ret = []
  for (let val in Object.values(obj)) {
    if (typeof Object.values(obj)[val] !== 'string') {
      ret.push(flatObject(Object.values(obj)[val]))
    } else {
      ret.push(Object.values(obj)[val])
    }
  }
  return ret
}
0 голосов
/ 28 июня 2019
// nested objects are made flat to one level
var flattenObject = Object.assign(
  {}, 
  ...function _flatten(o) { 
    return [].concat(...Object.keys(o)
      .map(k => 
        typeof o[k] === 'object' ?
          _flatten(o[k]) : 
          ({[k]: o[k]})
      )
    );
  }(obj)
)

// now join the values
var joinedValues = Object.values(flattenObject).join(';');

console.log(joinedValues);
0 голосов
/ 28 июня 2019

const obj = { 
  name: 'one',
  additionalInfo: {
    description: 'hello',
    sacri: ['m', 'e', 'n', 't', 'o'],
    foo: {
      bar: 'bat',
      biz: {
        tik: 'tock',
        hello: {
          world: 'YO',
          number: 5,
          bools: {
          	positive: true,
            negative: false,
            funcs: {
            	do: () => console.log('hello')
            }
          }
        }
      }
    }
  }
}

const stripObj = obj => (
  Object.values(obj)
  .reduce((prev, curr) => typeof curr === 'object' ? [...prev, stripObj(curr)] : [...prev, curr], [])
  .join(';')
)

const res = stripObj(obj)

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