NodeJS пара ключей / значений, нечувствительная к регистру сравнения - PullRequest
0 голосов
/ 05 июля 2019

Я хочу сравнить два вложенных json в NodeJS, позиция ключа json может измениться, а также сравнение ключ / значение должно быть нечувствительным к регистру

Я использую модуль NodeJS с глубоким выравниванием, но он работает только для сравнения с учетом регистра

let json1 = {
  "type": "NEW",
  "users": [{
    "id": "dskd3782shdsui",
    "email": "helloworld@xxxxxx.com"

  }],
  "ordered": [{
    "productId": "SHFDHS37463",
    "SKU": "ffgh"
  }]
}

let json2 = {
  "type": "NEW",
  "users": [{
    "id": "dskd3782shdsui",
    "email": "helloworld@xxxxxx.com"

  }],
  "ordered": [{
    "productId": "SHFDHS37463",
    "SKU": "ffgh"
  }]
}

var deepEqual = require('deep-equal')

console.log('==', deepEqual(
  json1,
  json2
))

Приведенный выше код работает, но если я меняю адрес электронной почты json2 на helloworld@xxxxxx.COM или ключ электронной почты на EMAIL, возвращается false, я хочу сравнение без учета регистра.

Ответы [ 4 ]

1 голос
/ 05 июля 2019

Для обработки нечувствительных к регистру сравнений между строковыми значениями (это не будет работать для ключей), вы можете использовать lodash _.isEqualWith() с функцией настройщика:

const obj1 = {"type":"NEW","users":[{"id":"dskd3782shdsui","email":"helloworld@xxxxxx.COM"}],"ordered":[{"productId":"SHFDHS37463","SKU":"ffgh"}]}
const obj2 = {"type":"new","users":[{"id":"dskd3782shdsui","email":"helloworld@xxxxxx.com"}],"ordered":[{"productId":"SHFDHS37463","SKU":"ffgh"}]}

const result = _.isEqualWith(
  obj1, 
  obj2, 
  (objValue, othValue) =>  _.isString(objValue) && _.isString(othValue) ?
    objValue.toLowerCase() === othValue.toLowerCase()
    :
    undefined
)

console.log('==', result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Чтобы обработать ключи с разными регистрами, необходимо нормализовать ключи до строчных, а затем выполнить сравнение.Я использую _.transform() для создания рекурсивной функции, которая повторяет вложенный объект и преобразует все ключи в нижний регистр.

const normaliseKeys = obj => _.transform((r, k, v) => {
  const key = _.isString(k) ? k.toLowerCase() : k;
  
  r[key] = _.isObject(v) ? normaliseKeys(v) : v;
})

const obj1 = normaliseKeys({"TYPE":"NEW","users":[{"id":"dskd3782shdsui","EMAIL":"helloworld@xxxxxx.COM"}],"ordered":[{"productId":"SHFDHS37463","SKU":"ffgh"}]})
const obj2 = normaliseKeys({"type":"new","users":[{"id":"dskd3782shdsui","email":"helloworld@xxxxxx.com"}],"ordered":[{"productId":"SHFDHS37463","SKU":"ffgh"}]})

const result = _.isEqualWith(
  obj1,
  obj2, 
  (objValue, othValue) =>  _.isString(objValue) && _.isString(othValue) ?
    objValue.toLowerCase() === othValue.toLowerCase()
    :
    undefined
)

console.log('==', result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 05 июля 2019

Я получил решение для этого, оно будет работать как для ключа / значения без учета регистра, так и если мы изменим позицию ключа

var deepEqual = require('deep-equal')

function toLower(a) {
 return JSON.stringify(a).toLowerCase();
}


console.log('==', deepEqual(
    JSON.parse(toLower(json1)),
    JSON.parse(toLower(json2))
) )  
0 голосов
/ 05 июля 2019

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

function jsonEqual(a,b) {
    return JSON.stringify(a).toLowerCase() === JSON.stringify(b).toLowerCase();
}
console.log(jsonEqual(json1, json2))

Рабочий пример здесь .

0 голосов
/ 05 июля 2019

Если вы не возражаете против использования https://lodash.com/docs/4.17.4#isEqualWith

var result = _.isEqualWith(json1, json2, (value1, value2, key) => { 
    console.log(value1, value2);
    //check for string and compare
});
...