当对象唯一时,将对象推入数组

Push object to array when unique

本文关键字:对象 数组 唯一      更新时间:2023-09-26

我已经四处寻找解决这个问题的方法,但没有运气。只有当对象是唯一的时候,我才尝试将对象推入数组。

我们有一个数据列表(实际的数据要大得多),我们循环遍历并只获取所需的数据(对于下拉框)。使用它,我们可以将我们想要的新数据推入数组…问题是所有的对象都被推,即使其中2个是相同的(用户名"克里斯"对象)。警报应该返回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>

对于如何解决这个问题有什么想法吗?

<

JSFiddle演示/strong>

注意: 我也在使用AngularJS,如果这有帮助的话。

基于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>

前提条件:

考虑以下getUserKey函数,这将是我们区分用户的基础:

function getUserKey (user) {
    return [user.name, user.phone, user.cusID].join('_');
}

解释:我们使用键name, phonecusID来定义唯一性,虽然在你的情况下,我想键' ' cusID '是足够的。

将用户放在一个由'userkey'索引的对象中:

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 need ',因为在angular中你可以遍历users对象。