我一直在寻找解决这个问题的方法,没有运气。我试图只有当这个对象是唯一的时才将对象推送到数组。
我们有一个数据列表(真正的一个更大),我们循环并获得所需的数据(对于下拉框)。使用这个,我们可以将我们想要的新数据推送到一个数组中...问题是所有对象都被推送,即使它们中的两个是相同的(用户名“Chris”对象)。警报应该返回3个对象,因为2个正在插入的对象是相同的(只有一个应该进入)。
var list = [{
ID: 1,
name: "Chris",
phone: "111",
cusID: 1
}, {
ID: 2,
name: "Alex",
phone: "222",
cusID: 2
}, {
ID: 3,
name: "Jim",
phone: "333",
cusID: 3
}, {
ID: 4,
name: "Chris",
phone: "111",
cusID: 1
}];
var filterList = [];
$.each(list, function (i, item) {
var newUser = {
name: item.name,
cusID: item.cusID
};
if ($.inArray(newUser, filterList) == -1) {
filterList.push(newUser);
}
});
alert(filterList);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
有关如何解决此问题的任何想法?
注意: 如果这对我有帮助,我也会使用AngularJS。
答案 0 :(得分:1)
基于Object comparison in JavaScript 尝试这样的事情:
$.each(list, function (i, item) {
var newUser = {
name: item.name,
cusID: item.cusID
};
var jsonFL = $.map(filterList, function(v,i) {
return JSON.stringify(v);
});
jsonFL.indexOf( JSON.stringify(newUser) ) > -1 || filterList.push(newUser);
});
console.log(filterList);
var list = [{
ID: 1,
name: "Chris",
phone: "111",
cusID: 1
}, {
ID: 2,
name: "Alex",
phone: "222",
cusID: 2
}, {
ID: 3,
name: "Jim",
phone: "333",
cusID: 3
}, {
ID: 4,
name: "Chris",
phone: "111",
cusID: 1
}];
var filterList = [];
$.each(list, function (i, item) {
var newUser = {
name: item.name,
cusID: item.cusID
};
var jsonFL = $.map(filterList, function(v,i) {
return JSON.stringify(v);
});
jsonFL.indexOf(JSON.stringify(newUser)) > -1 || filterList.push(newUser);
});
console.log(filterList);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:0)
考虑以下getUserKey
功能,这将是我们区分用户的基础:
function getUserKey (user) {
return [user.name, user.phone, user.cusID].join('_');
}
说明:我们使用键name
,phone
和cusID
来定义单一性,但在您的情况下,我猜关键字``cusID`就足够了。
var users = {};
list.forEach(function (user) {
users[getUserKey(user)] = {name: user.name, cusID: user.cusID};
});
var filterList = [];
Object.keys(users).forEach(function (key) {
filterList.push(users[key])
});
我写了'if needed',因为在角度你可以迭代users
对象。
<强> DEMO 强>
答案 2 :(得分:-1)
你走了:
https://jsfiddle.net/u2w0by4v/11/
$.each(list, function (i, item) {
var newUser = {
name: item.name,
cusID: item.cusID
};
var zUser = newUser.name+","+newUser.cusID;
if ($.inArray(zUser, filterList) == -1) {
filterList.push(zUser);
}
});
问题是数组的结构。这是一个多维数组,所以检查不起作用。基本上,我只是将newUser对象转换为逗号分隔的字符串,并将其传递给您的filterList数组。