将对象名称添加到对象内的字段

时间:2021-03-28 00:49:02

标签: javascript oop functional-programming lodash

假设我有一个看起来像这样的对象

const randomObj = {
  myObj: { id: "1", value: "random string", text: "random text"},
  otherObj: { id: "2", value: "random string 2", text: "random text 2"}
}

我想遍历每个对象及其值,但要向对象添加一个额外的字段

const newObj = { ..._.mapValues(randomObj) }

预期输出

newObj: {
          myObj: { id: "1", value: "random string", text: "random text"},
          otherObj: { id: "2", value: "random string 2", text: "random text 2"},
        }

期望输出

 newObj: {
         myObj: { id: "1", value: "random string", text: "random text", objectId: "myObj"},
         otherObj: { id: "2", value: "random string 2", text: "random text 2", objectId: "otherObj"},
         } 

如何添加该附加字段,其中附加字段将是对象的名称?

3 个答案:

答案 0 :(得分:1)

调用 _.mapValues() 迭代器,属性值作为第一个参数,键作为第二个参数,整个对象作为第三个参数。使用 object spread 创建一个以 objectId 为键的新对象。

const randomObj = {
  myObj: { id: "1", value: "random string", text: "random text"},
  otherObj: { id: "2", value: "random string 2", text: "random text 2"}
}

const newObj = _.mapValues(randomObj, (v, k) => ({
  ...v,
  objectId: k
}))

console.log(newObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>

如果没有 lodash,您可以使用 Object.entries() 将对象转换为 [key, value] 对数组、映射对,然后使用 Object.fromEntries() 将数组对转换回对象。< /p>

const randomObj = {
  myObj: { id: "1", value: "random string", text: "random text"},
  otherObj: { id: "2", value: "random string 2", text: "random text 2"}
}

const newObj = Object.fromEntries(
  Object.entries(randomObj)
    .map(([k ,v])  => [k, {
      ...v,
      objectId: k
    }])
)

console.log(newObj)

答案 1 :(得分:1)

const randomObj = {
  myObj: { id: "1", value: "random string", text: "random text"},
  otherObj: { id: "2", value: "random string 2", text: "random text 2"}
}


Object.keys(randomObj).forEach(key => randomObj[key].objectId = key);

console.log(randomObj);

答案 2 :(得分:1)

使用原生方法 Object.entries() 和 Array#reduce() 就像使用 lodash 一样简单

const randomObj = {
  myObj: { id: "1", value: "random string", text: "random text"},
  otherObj: { id: "2", value: "random string 2", text: "random text 2"}
},

res = Object.entries(randomObj).reduce((a,[k,v])=>(a[k] = {...v, objectId:k},a),{})

console.log(res)

相关问题