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

Add object name to field inside object

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

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"},
         } 

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

_.mapValues() iteratee 以 属性 的值作为第一个参数,键作为第二个参数,整个对象作为第三个参数。使用对象传播创建一个新对象,键为 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() 将对数组转换回对象.

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)

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

使用本地方法 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)