Как мне сопоставить два объекта, используя lodash или javascript? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь использовать функцию isMatch из lodash для сопоставления ниже двух объектов, но это всегда дает мне истину, так как я вижу, что длина объекта perm различна и не совпадает, либо день2 отсутствует в массиве параметров ниже, как япопробовал.

var  object  =   { 
  param: ['day1', 'day2', 'day3'],
  param2: ['day2', 'day3', 'day1', 'day0'],
  param3: ['day1'] 
};
var object2 = { 
  param: ['day3', 'day1'],
  param3: ['day1'],
  param2: ['day3', 'day2', 'day0', 'day1'] 
};

var matched = _.isMatch(object, object2);

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

Массив будет упорядоченным образом, если он содержит все значения и соответствует всем ключам, то все он должен возвращать true, иначе false.

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Вы можете использовать эту простую функцию JavaScript:

function match(a, b) {
    return Object.keys(a).every(key => {
        const set = new Set(a[key]);
        return key in b && b[key].length === a[key].length 
                        && b[key].every(val => set.has(val));
    });
}

var  object  =   {  param: ['day1', 'day2', 'day3'], param2: ['day2', 'day3', 'day1', 'day0'], param3: ['day1'] };
var object2 = { param: ['day3', 'day1'], param3: ['day1'], param2: ['day3', 'day2', 'day0', 'day1'] };

console.log(match(object, object2));

С lodash вы можете использовать difference для каждой пары ключ / значение:

function match(a, b) {
    return _.every(a, (value, key) => !_.difference(value, b[key]).length);
}

var  object  =   {  param: ['day1', 'day2', 'day3'], param2: ['day2', 'day3', 'day1', 'day0'], param3: ['day1'] };
var object2 = { param: ['day3', 'day1'], param3: ['day1'], param2: ['day3', 'day2', 'day0', 'day1'] };

console.log(match(object, object2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
0 голосов
/ 04 мая 2019

_. IsEqual (значение, другое)

Выполняет глубокое сравнение двух значений для определения их эквивалентности.Он поддерживает сравнение массивов, буферов массивов, логических значений, объектов даты, объектов ошибок, карт, чисел, объектов объектов, регулярных выражений, множеств, строк, символов и типизированных массивов.Объектные объекты сравниваются по своим, а не наследуемым перечисляемым свойствам.Функции и узлы DOM сравниваются по строгому равенству, т.е. ===

var object = { 
  param: ['day1', 'day2', 'day3'],
  param2: ['day2', 'day3', 'day1', 'day0'],
  param3: ['day1'] 
};

var other = { 
  param: ['day1', 'day2', 'day3'],
  param2: ['day2', 'day3', 'day1', 'day0'],
  param3: ['day1'] 
};
 
_.isEqual(object, other);
// returns true

Возвращается значение true.

var object = { 
  param: ['day1', 'day2', 'day3'],
  param2: ['day2', 'day3', 'day1', 'day0'],
  param3: ['day1'] 
};

var other = { 
  param: ['day3', 'day1'],
  param3: ['day1'],
  param2: ['day3', 'day2', 'day0', 'day1'] 
};

_.isEqual(object, other);
// returns false

Возвращается значение false

0 голосов
/ 04 мая 2019

_. IsMatch в основном скажет вам, если второй объект «содержится» в первом.

var object = { 'a': 1, 'b': 2 };

_.isMatch(object, { 'b': 2 });
// => true

_.isMatch(object, { 'b': 1 });
// => false

(https://lodash.com/docs#isMatch)

Похоже, вам нужно _. IsEqual

(https://lodash.com/docs#isEqual)

...