Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取具有相同值的两个对象,并使其成为单个对象_Javascript_Arrays_Angularjs_Angularjs Directive_Filter - Fatal编程技术网

Javascript 如何获取具有相同值的两个对象,并使其成为单个对象

Javascript 如何获取具有相同值的两个对象,并使其成为单个对象,javascript,arrays,angularjs,angularjs-directive,filter,Javascript,Arrays,Angularjs,Angularjs Directive,Filter,我正在创建一个允许手动筛选的多选下拉组件。当项目第一次显示时,我正在一系列对象中循环: customers = [ {name: "Boe", city: "Scottsdale", state: "AZ", zip: 45454}, {name: "Tom", city: "Austin", state: "TX", zip: 34323} ] 如果用户从下拉列表中选择上述客户而不进行筛选,则这是控制台中的对象: Object {name: "Bo

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

   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”

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

如何才能使这两个对象被视为完全相同


谢谢

这不是语言级别的功能。相反,您必须检查值是否相等。Lodash有一个方法,可以递归检查所有属性和值,以查看所有内容是否匹配


或者,您可以找到一种散列对象的方法,或者干脆
JSON。将它们字符串化
并比较这些值。

如果这些对象的所有值都是原语,您可以这样做

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;
}

谢谢Andy…我使用angular.equals应该做同样的事情。但问题是我在帖子中列出的两个对象永远都不相等。这是因为$$haskKey不同,还是因为它们本质上是包含同一对象的两个不同数组?我真的想弄清楚如何制作这两个对象s高于equal,因为现在angular.equals在我筛选并选择一行时返回false,在下拉列表未筛选时单击同一行,这意味着它们不是相同的东西。我如何才能使它们被视为相同的?是的,这是可行的。谢谢。我所做的唯一更改是使用“删除”“角度属性上的键不会删除该属性。它只删除您自己创建的属性。在Angular中,可以使用Angular.toJson从对象中删除$$haskey属性。因此,我使用“ob1=angular.toJson(ob1)”删除$hashkey属性。
   <dropdown-select items="customers"></dropdown-select>
Object {name: "Boe", city: "Scottsdale", state: "AZ", zip: 46545, $$hashkey: "object 170"}
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;
}