【问题标题】:How to compare two objects with lodash and return new object?如何用 lodash 比较两个对象并返回新对象?
【发布时间】:2019-06-19 14:16:01
【问题描述】:

如果在 object2 中找到,我需要比较两个对象并从 object1 返回特定值。

object1 = {
  "body": {
    "items": [
      {
        "data": {
          "name": "Smith",
          "status": "Ready",
          "userinfo": [
            {
              "dob": "01/01/2000",
              "nickname": "Joe"
            }
          ]
        },
        "workinfo": {
          "company": "mycompany",
          "address": "101 Main str."
        }
      },
      {
        "data": {
          "name": "Luke",
          "status": "Ready",
          "userinfo": [
            {
              "dob": "01/01/2001",
              "nickname": "LL"
            }
          ]
        },
        "workinfo": {
          "company": "mycompany",
          "address": "101 Main str."
        }
      }
    ]
  }
}

Object2 甚至是简单的一个:

object2 = {
  "items": [
    {
      "name": "Smith",
      "status": "Ready"
    },
    {
      "name": "Luke",
      "status": "Ready"
    }
  ]
}

所以如果在 Object2 items.name 中找到 Object1 body.items[x].data.name 那么最后我需要像这样获取新对象:

object3 = {{name: "Smith", status: "Ready"}, {name: "Luke", status: "Ready"}}

【问题讨论】:

  • 您的第三个对象无效。您很可能希望输出一个对象数组。

标签: javascript lodash


【解决方案1】:

您可以使用过滤器并查找:

var obj1 = {
  "body": {
    "items": [{
        "data": {
          "name": "Smith",
          "status": "Ready",
          "userinfo": [{
            "dob": "01/01/2000",
            "nickname": "Joe"
          }]
        },
        "workinfo": {
          "company": "mycompany",
          "address": "101 Main str."
        }
      },
      {
        "data": {
          "name": "Luke",
          "status": "Ready",
          "userinfo": [{
            "dob": "01/01/2001",
            "nickname": "LL"
          }]
        },
        "workinfo": {
          "company": "mycompany",
          "address": "101 Main str."
        }
      }
    ]
  }
}

var obj2 = {
  "items": [{
      "name": "Smith",
      "status": "Ready"
    },
    {
      "name": "Luke",
      "status": "Ready"
    }
  ]
}

var output = obj2.items.filter(({name}) => obj1.body.items.find(({data}) => name === data.name))

console.log(output)

过滤器会返回所有通过查找条件的对象,即如果在obj1中找到了名字

【讨论】:

    【解决方案2】:

    您可以使用_.intersectionWith() 从obj2 返回项目,它们的name 等于data.name 中的obj2 项目:

    const obj1 = {"body":{"items":[{"data":{"name":"Smith","status":"Ready","userinfo":[{"dob":"01/01/2000","nickname":"Joe"}]},"workinfo":{"company":"mycompany","address":"101 Main str."}},{"data":{"name":"Luke","status":"Ready","userinfo":[{"dob":"01/01/2001","nickname":"LL"}]},"workinfo":{"company":"mycompany","address":"101 Main str."}}]}}
    const obj2 = {"items":[{"name":"Smith","status":"Ready"},{"name":"Luke","status":"Ready"}]}
    
    const result = _.intersectionWith(obj2.items, obj1.body.items, 
      (a, b) => _.get(a, 'name') === _.get(b, 'data.name')
    )
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

    【讨论】:

      【解决方案3】:

      在 ES6 中,Array.filter 和 Array.some 是一件容易的事:

      const obj1 = {"body":{"items":[{"data":{"name":"Smith","status":"Ready","userinfo":[{"dob":"01/01/2000","nickname":"Joe"}]},"workinfo":{"company":"mycompany","address":"101 Main str."}},{"data":{"name":"Luke","status":"Ready","userinfo":[{"dob":"01/01/2001","nickname":"LL"}]},"workinfo":{"company":"mycompany","address":"101 Main str."}}]}}
      const obj2 = {"items":[{"name":"Smith","status":"Ready"},{"name":"Luke","status":"Ready"}]}
      
      const r = obj2.items.filter(x => obj1.body.items.some(y => y.data.name == x.name))
      
      console.log(r)

      由于您在 obj2 中拥有正确布局的对象,您可以从那里开始并根据 obj1 过滤它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多