Как сравнить два объекта с lodash и вернуть новый объект? - PullRequest
1 голос
/ 19 июня 2019

Вот два объекта, которые мне нужно сравнить и вернуть конкретные значения из объекта1, если они найдены в объекте 2.

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

Итак, если Object1 body.items [x] .data.name найден в Object2 items.name, то, наконец, мне нужно получить новый объект, подобный этому:

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

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Вы можете использовать фильтр и найти:

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

0 голосов
/ 19 июня 2019

С 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.

0 голосов
/ 19 июня 2019

Вы можете использовать _.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>
...