簡體   English   中英

如何檢查一個 JavaScript 對象中的值是否存在於另一個對象中?

[英]How to check if values in one JavaScript object are present in another one?

我正在嘗試比較 json_str1 和 json_str2,這里它應該返回 true,因為 json_str1 中的所有元素都存在於 json_str2 中。

現在我正在這樣做很長的路要走

json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';

json_obj1 = $.parseJSON(json_str1);
json_obj2 = $.parseJSON(json_str2);

arr1 = $.map(json_obj1, function(el) { return el });
arr2 = $.map(json_obj2, function(el) { return el });

if($(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0)
    alert("equal");
else
    alert("not equal");

在不將對象轉換為數組的情況下,如何使其簡短而簡單?

https://jsfiddle.net/kq9gtdr0/

使用以下代碼:

Object.keys(json_obj1) . every(k1 => 
  Object.keys(json_obj2) . some(k2 =>
    json_obj1[k1] === json_obj2[k2]
  )
);

用英語講:

每個k1json_obj1滿足一些關鍵條件k2json_obj2 satisifies條件是價值json_obj1與關鍵k1等於價值json_obj2與關鍵k2

或者更多會話英語:

第一個對象中的每個值都匹配第二個中的某個值。

使用lodash

var _ = require('lodash');

function compareValues(jstr1, jstr2) {
  return _.isEqual(_.valuesIn(JSON.parse(jstr1)).sort(), _.valuesIn(JSON.parse(jstr2)).sort());
}

json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';

console.log(compareValues(json_str1, json_str2));

有簡短而准確的方法。

您可以使用第三方但非常受歡迎的實用程序庫Lodash。 鏈接功能可以檢查是否相等。

  1. 首先將JSON解析為對象
  2. 然后使用_.values()將每個鍵的值提取到單獨的數組中
  3. 找出兩個數組的區別。 如果它是一個空數組,那么它們都是相等的。

您可以將所有步驟鏈接到一個語句中,如:

_.isEmpty(_.difference(_.values(json_obj1), _.values(json_obj2)))

示例: https//jsfiddle.net/kq9gtdr0/4/

欲獲得更多信息:

https://lodash.com/docs#values

https://lodash.com/docs#difference

https://lodash.com/docs#isEmpty

您可以從CDN( https://cdn.jsdelivr.net/lodash/4.5.1/lodash.min.js )中包含該庫,也可以將其作為普通腳本下載並使用。 Lodash提供了大量有用的實用功能,使JS編程變得更加容易。 你最好試一試。

如果您更喜歡使用庫,那么您可以使用下划線isMatch

_.isMatch(object, properties)

告訴您屬性中的鍵和值是否包含在對象中。

擴展@user663031 的精彩答案,以防您需要進行深入比較,這里的代碼有效:

export function objectOneInsideObjectTwo(jsonObj1: any, jsonObj2: any): boolean {
  return Object.keys(jsonObj1).every((k1) => {
    if (parseType(jsonObj1[k1]) === 'dict') {
      return objectOneInsideObjectTwo(jsonObj1[k1], jsonObj2[k1]);
    }
    if (parseType(jsonObj1[k1]) === 'array') {
      const results: boolean[] = [];
      jsonObj1[k1].forEach((o: any, i: number) => {
        if (parseType(o) === 'dict') {
          results.push(objectOneInsideObjectTwo(o, jsonObj2[k1][i]));
        } else {
          results.push(o === jsonObj2[k1][i]);
        }
      });
      return results.every((r) => r);
    }
    return Object.keys(jsonObj2).some((k2) => jsonObj1[k1] === jsonObj2[k2]);
  });
}

export function parseType<T>(v: T): string {
  if (v === null || v === undefined) {
    return 'null';
  }
  if (typeof v === 'object') {
    if (v instanceof Array) {
      return 'array';
    }
    if (v instanceof Date) {
      return 'date';
    }
    return 'dict';
  }
  return typeof v;
}

你可以試試這個

var json_str1 = {"0":"a","1":"b","2":"c"};
var json_str2 = {"0":"c","1":"b","2":"a"};
var flag =  1;

if(Object.keys(json_str1).length == Object.keys(json_str2).length){
    Object.keys(json_str1).forEach(function(x){
        if(!json_str2.hasOwnProperty(x) || json_str2[x] != json_str1[x]){
            flag = 0;
            return;
        }                      
    });
}

if(flag)
    alert('equal');
else
    alert('Not Equal');

如果你想知道兩個對象是否都有相同的密鑰,那么如果沒有至少將兩個對象的密鑰轉換為帶有Object.keys的數組或循環遍歷這兩個對象,則無法做到這一點!

原因很簡單:很明顯,你必須比較兩個對象的鍵數,唯一的方法是循環遍歷所有屬性或Object.keys

所以我認為最簡單的方法是:

json_obj1 = JSON.parse('{"0":"a","1":"b","2":"c"}');
json_obj2 = JSON.parse('{"0":"c","1":"b","2":"a"}');

keys_1 = Object.keys(json_obj1);
keys_2 = Object.keys(json_obj2);

if(keys_1.length === keys_2.length && keys_1.every(key => keys_2.indexOf(key) >= 0)) {
    alert('equal')
} else {
    alert('not equal')
}

如果您只想檢查json1中是否存在json1中的所有鍵,您可以執行以下操作:

json_obj1 = JSON.parse('{"0":"a","1":"b","2":"c"}');
json_obj2 = JSON.parse('{"0":"c","1":"b","2":"a"}');
if(Object.keys(json_obj1).every(key => key in json_obj2)) {
  alert('equal');
} else {
  alert('not equal');
}

在您的問題和評論中,您表明您只想驗證“json_str1中的所有元素都存在於json_str2中”。 您的示例代碼不只是這樣做,它通過測試第一個對象中的所有鍵(而不是值)是否在第二個對象中並且第二個對象中的所有鍵都在第一個對象中來檢查鍵的完全相等性。 通過查看您的代碼,我假設當您說“元素”時,您指的是鍵。

除此之外,這可能會有所幫助:

// Your first few lines of code

json_str1 = '{"0":"a","1":"b","2":"c"}';
json_str2 = '{"0":"c","1":"b","2":"a"}';

json_obj1 = $.parseJSON(json_str1);
json_obj2 = $.parseJSON(json_str2);

// My new code

var values1 = Object.keys(json_obj1).map(key => json_obj1[key]);
var values2 = Object.keys(json_obj2).map(key => json_obj2[key]);

// Check if every key in the first object is in the second object.
values1.every(k1 => values2.indexOf(k1) >= 0);

// OR

// Check for equality of keys by checking both directions.
values1.every(k1 => values2.indexOf(k1) >= 0) && values2.every(k2 => values1.indexOf(k2) >= 0);

這是獲得密鑰的兩行,還有一行要檢查。 您只需要這兩項檢查中的一項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM