将一个对象转换为对象字典

6
我有一个包含未知键/值对的对象,像这样:
myObj = {
    key_1: value_1,
    key_2: value_2,
    key_n: value_n
}

我希望把它转换成一个结构化对象的字典,就像这个例子一样:
dictOfStructureObjects =
{
 key_1: {
  name: value_1,
  type: 'foo'},
 key_2: {
  name: value_2,
  type: 'foo'},
 key_n: {
  name: value_n,
  type: 'foo'}
}

我试过这个:

var dic = snapshot.val();
var arr = Object.keys(dic || {});
var names = arr.map(element => {
    var rObj = {};
    rObj[element.value] = {name: dic[element.value], type: 'foo'};
});

但是我认为,尝试通过其属性 value 来引用数组元素的值是不正确的...


5
structuredObject是一个数组,但它有属性,这在字面上是不可能的。请将其转换为有效的数据结构作为结果。 - Nina Scholz
为什么?这背后的原因是什么? - Jonas Wilms
是的,它是一个结构化对象数组,每个对象都有属性。我已经编辑了我的代码片段以使其更清晰。 - Laurent Maquet
@jonas:这样做的原因是为了用“foo”来丰富每个对象。 - Laurent Maquet
4个回答

10

如评论中指出的那样,您期望的输出不是一个有效的数组。

如果您想要一个有效的数组,可以像这样做:

function convert(obj) {
    return Object.keys(obj).map(key => ({
        name: key,
        value: obj[key],
        type: "foo"
    }));
}

const myObj = {
    key_1: "value_1",
    key_2: "value_2",
    key_3: "value_3",
};

console.log(convert(myObj));

如果您希望将其作为对象使用,可以这样:

function convert(obj) {
    return Object.keys(obj).reduce((result, key) => {
        result[key] = {
            name: obj[key],
            type: "foo"
        };
        return result;
    }, {});
}

const myObj = {
    key_1: "value_1",
    key_2: "value_2",
    key_3: "value_3",
};

console.log(convert(myObj));


明白了!我实际上需要一个对象字典...我已经编辑了我的问题。 - Laurent Maquet
@LaurentMaquet 我编辑了我的答案,加入了你想要的内容 :) - tiagodws
好的,谢谢你,tiagodws。但是我正在尝试在没有单独函数的情况下实现你的解决方案。我尝试了这个,但似乎不正确... names = Object.keys(obj || {}).reduce((result, key) => (result[key] = {name: obj[key], type: 'foo'})); - Laurent Maquet
@LaurentMaquet 在你的 reduce 函数中,你需要返回整个 result 对象 :) 你现在的写法 ((result[key] = {name: obj[key], type: 'foo'})) 只是返回了当前对象。你可以尝试这样写:names = Object.keys(obj || {}).reduce((result, key) => (result[key] = {name: obj[key], type: 'foo'}, result), {}); - tiagodws
1
谢谢tiagodws。现在没问题了! - Laurent Maquet

3
您可以将键映射为具有所需键和新对象的新对象。

var object = { key_1: 'value_1', key_2: 'value_2', key_n: 'value_n' },
    newObject = Object.assign(
        ...Object.keys(object).map(k => ({ [k]: { name: object[k], type: 'foo' } }))
    );
    
console.log(newObject);
.as-console-wrapper { max-height: 100% !important; top: 0; }


2

如果你想要一个数组...

myObj = {
  key_1: "value1",
  key_2: "value_2",
  key_n: "value_n"
}

var a = [];
Object.entries(myObj).forEach(itm=>a.push({key: itm[0], value: itm[1]}));
console.log(a);

如果你想要一个对象。

myObj = {
  key_1: "value1",
  key_2: "value_2",
  key_n: "value_n"
}

var a = {};
Object.entries(myObj).forEach(itm=>a[itm[0]] = {key: itm[0], value: itm[1]});
console.log(a);


谢谢:这应该解决我的问题,但我遇到了一个错误:Object.entries不是一个函数。我正在使用Node v6.11.5的Firebase Cloud Functions。 - Laurent Maquet

1
标题有些令人困惑。原帖并不是想将类对象转换为字典,而是想修改数据结构。
如果您真的想将类对象转换为字典:
JSON.parse(JSON.stringify(obj))

这可能是迄今为止最低效的方法。请参见https://dev59.com/PlsW5IYBdhLWcg3wsY5P#66774294以获取更好的解决方案。 - sezanzeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接