如何获取具有相同值的两个对象,并将其视为一个对象

How to take two objects with the same values, and make it so that they are seen as one single object

本文关键字:对象 两个 一个对象 获取 何获取      更新时间:2023-09-26

我正在创建一个允许手动筛选的多选下拉组件。当项目第一次显示时,我正在循环浏览一组对象:

   customers = [
       {name: "Boe", city: "Scottsdale", state: "AZ", zip: 45454},
       {name: "Tom", city: "Austin", state: "TX", zip: 34323}
    ]

如果用户在没有筛选的情况下从下拉列表中选择上述客户,则这是控制台中的对象:

 Object {name: "Boe", city: "Scottsdale", state: "AZ", zip: 46545, $$hashkey: "object 71"}

当设置手动过滤器时,这允许用户键入的文本过滤下拉列表,并将其传递到组件外部。一个自定义过滤器的例子可能是这样的,它很可能从服务器中过滤一些内容,然后发回一个新的对象数组。例如,假设用户在输入中键入字母"b",则上面的数据将被过滤,在下拉列表中只显示"Boe",下面的匹配数组将只包含"Boe"

 var matches = [];
 for (var i = 0; i < unfilteredCustomers.length; i++) {
     //filter it
 }
 //update the customers based on each letter that is typed
 $scope.customers = matches;

然后将其传递回组件,如下所示:

   <dropdown-select items="customers"></dropdown-select>

因此,最初,传入的客户是第一个客户阵列,一旦用户开始键入筛选,客户就会得到更新并返回到组件中。如果我过滤并选择已过滤的行,以下是控制台中显示的内容:

Object {name: "Boe", city: "Scottsdale", state: "AZ", zip: 46545, $$hashkey: "object 170"}

$$hashKey正在更改。我意识到我基本上是在一个新的数组中发回的,这个数组改变了对原始项集的引用。但问题是,该组件的功能是,如果用户进行筛选并做出选择,则下拉列表会返回到其原始项目。因此,我遇到的问题是,一旦用户选择了一个已筛选的项目,并且下拉列表重新打开,用户就可以再次选择相同的项目,因为"this.selectedItems.indexOf(selectedRow)===-1看不到已筛选的行与未筛选下拉列表而用户进行选择时相同。

我怎样才能让这两个物体被认为是完全相同的呢?

感谢

如果这些对象的所有值都是基元,则可以执行类似的操作

function areSameObjects(ob1, ob2){
    var areSame = false;
    if(Object.keys(ob1).length === Object.keys(ob2).length){
        delete ob1.$$hashkey;
        delete ob2.$$hashkey;
        areSame = Object.keys(ob1).reduce(function(state, key){
            state = Object.is(ob1[key],ob2[key]) && state;
            return state;
        }, true);
    }
    return areSame;
}

这不是语言级别的功能。相反,您必须检查值是否相等。Lodash有一个方法,可以递归地检查所有属性和值,看看是否所有内容都匹配https://lodash.com/docs#isEqual.

或者,您可以找到一种对对象进行散列的方法,或者只对两者进行JSON.stringify并比较这些值。