独特时将对象推送到数组

时间:2015-09-23 14:35:38

标签: javascript jquery angularjs

我一直在寻找解决这个问题的方法,没有运气。我试图只有当这个对象是唯一的时才将对象推送到数组。

我们有一个数据列表(真正的一个更大),我们循环并获得所需的数据(对于下拉框)。使用这个,我们可以将我们想要的新数据推送到一个数组中...问题是所有对象都被推送,即使它们中的两个是相同的(用户名“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>

有关如何解决此问题的任何想法?

JSFiddle Demo

注意: 如果这对我有帮助,我也会使用AngularJS。

3 个答案:

答案 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('_');
}

说明:我们使用键namephonecusID来定义单一性,但在您的情况下,我猜关键字``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 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数组。