讨人喜欢的对象+数组+对象到一个对象javascript

时间:2017-07-13 13:01:57

标签: javascript object

我会直截了当地说,所以这就是我所拥有的:

    const someObj = {
    one: [
        {
            id: 123,
            text: "lalala"
        },
        {
            id: 456,
            text: "lalala2"
        },
        {
            id: 789,
            text: "lalala3"
        }
    ],
    two: [
        {
            id: 111,
            text: "text random"
        },
        {
            id: 222,
            text: "text random2"
        },
        {
            id: 333,
            text: "text random3"
        }
    ]
};

这就是我需要的:

    const someOtherObj = {
    111: {
        id: 111,
            text: "text random"
    },
    222: {
        id: 222,
        text: "text random2"
    },
    333: {
        id: 333,
        text: "text random3"
    },
    123: {
        id: 123,
        text: "lalala"
    },
    456: {
        id: 456,
        text: "lalala2"
    },
    789: {
        id: 789,
        text: "lalala3"
    }
};

我知道这可以在没有百万次循环的情况下实现,只是我想不出任何智能解决方案。 :/所以,也许有人可以帮我解决这个难题? :)

谢谢:)

2 个答案:

答案 0 :(得分:0)

尝试使用ES6

Array#reduce功能
  1. 第一个reduce创建了包含所有内部对象的数组
  2. 第二个reduce用于使用id
  3. 创建对象密钥

    const someObj = { one: [ { id: 123, text: "lalala" }, { id: 456, text: "lalala2" }, { id: 789, text: "lalala3" } ], two: [ { id: 111, text: "text random" }, { id: 222, text: "text random2" }, { id: 333, text: "text random3" } ] };
    
    var res = Object.values(someObj).reduce((a,b)=> (b.forEach(val=> a.push(val)),a),[])
    
    var f = res.reduce((a,b)=> (a[b.id] = b, a),{})
    console.log(f)

答案 1 :(得分:0)

你只需要使用两个循环,不再需要(使用ES6看你的例子也使用它)

const newObj = {};
for(const key in someObj) {
  for(let i = 0; i < someObj[key].length; i++) {
    const obj = someObj[key][i];
    newObj[obj.id] = {
      id: obj.id,
      text: obj.text
    }
  }
}