重新格式化对象以使其更浅

时间:2019-03-20 19:15:18

标签: javascript javascript-objects

在示例对象myObject中,使用数字键存储每个对象。

> 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 个答案:

答案 0 :(得分:1)

您的static是一个数组,因此不应该将myObject用于此数组。随便

Object.keys

或使用ES6:

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

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

答案 1 :(得分:0)

减少功能!

    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));

答案 2 :(得分:0)

如果您想要一个具有单个字符串值的键,则需要对数据结构进行一些假设。例如,不能将键拆分为具有更多键的对象,因为在这种情况下,尚不清楚父键应获取哪个值。您可以遍历对象,直到使用简单的递归函数找到基值。然后使用顶级键在reduce循环中调用它:

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)