Переформатировать объект, чтобы сделать его более мелким - PullRequest
1 голос
/ 20 марта 2019

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

> 0: {Foo: {...}}
> 1: {Bar: {...}}

Чтобы получить доступ к значению в этом объекте, необходимо добавить целое число:

console.log(myObject[0].Foo)

Как переформатировать объект, чтобы получить объект с парой ключ-значение следующим образом:

console.log(myObject.Foo)

Я уже пробовал:

const myObject = [
	{
  	"Foo": {
    	"test": "output of foo"
    }
  },
  {
  	"Bar": {
    	"test": "output of bar"
    }
  }
]

console.log(myObject[0].Foo.test);
// desired result:
// console.log(myObject.Foo.test);
// should output: output of foo

function extend(obj, src) {
    Object.keys(src).forEach(function(key) { obj[key] = src[key]; });
    return obj;
}

Object.keys(myObject).forEach(function (r) {
	const newKey = Object.keys(myObject[r])[0];
	const newValue = myObject[r][newKey];
  // console.log('key: ', newKey); // output: Foo
  // console.log('value: ', newValue); // output: {"test": "output of bar"}
  extend([newKey], {newValue});
}, []);

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Ваш myObject является массивом, поэтому вы не должны использовать Object.keys с этим.Просто сделай

function extend(obj, src) {
    Object.keys(src).forEach(function(key) { obj[key] = src[key]; });
    return obj;
}

var result = myObject.reduce(extend, {});

или с ES6:

var results = Object.assign({}, ...myObject);
0 голосов
/ 20 марта 2019

Если вам нужен один ключ с одним строковым значением, вам нужно сделать несколько предположений о структуре данных. Например, ключи не могут быть разделены на объекты с большим количеством ключей, потому что в этом случае не ясно, какое значение должен получить родительский ключ. Вы можете перемещаться по объекту, пока не найдете базовое значение с помощью простой рекурсивной функции. Затем вызовите его в цикле уменьшения с помощью клавиш верхнего уровня:

const myObject = [{"Foo": {"test": "output of foo"}},{"Bar": {"test": "output of bar"}}]

// Get the leaf node value:
const getLastVal = (obj) => (typeof obj !== 'object' || typeof obj === null) ?  obj : getLastVal(Object.values(obj)[0]);
  
let obj = myObject.reduce((obj, cur) => {
    Object.entries(cur).forEach(( [k, v]) =>  obj[k] = getLastVal(v))
    return obj
}, {})
console.log(obj)
0 голосов
/ 20 марта 2019

Уменьшить функцию!

    const myObject = [
    {
    "Foo": {
        "test": "output of foo"
    }
  },
  {
    "Bar": {
        "test": "output of bar"
    }
  }
]

console.log(myObject[0].Foo.test);
myObject.reduce((acc, curr) => {
  return {...acc, ...curr};
}, {})
console.log(JSON.stringify(myObject));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...