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