Javascript从对象创建唯一对象的数组

时间:2016-09-21 15:40:11

标签: javascript arrays

我有一个弹性搜索响应($ scope.myval),它包含100条用户详细信息记录。在这100条记录中,我需要一个仅包含用户名和其他一些字段的列表,其中我知道只有5条唯一记录。

我要做的是创建一个仅包含唯一对象的新数组。

var meta = [];

function checkExists (value){
    for (k = 0; k < meta.length ; k++){
        if( meta[k].LoginName == value.LoginName){
            console.log("matches")
        }
        else{
            meta.push({
                LoginName: value.LoginName,
            });
        }
    }
}

for (j = 0; j <$scope.myval.length ; j++){
    checkExists($scope.myval[j]._source)
}

console.log(meta);

然而,由于meta为空,这似乎不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我建议您编辑代码,以便“CheckExists”完全执行此操作,如果它不存在,则显式添加它。

function checkExists (value){
    for (k = 0; k < meta.length ; k++){
        if( meta[k].LoginName == value.LoginName){
            console.log("matches")
            valueExists = true;
        }
    }
}

if (!valueExists){
     meta.push({
        LoginName: value.LoginName,
    });
}

答案 1 :(得分:0)

var makeArrayOfUniqueRecords = function (inputArray, fields) {

  var uniqueArray = [],
      mappedArray = inputArray.map(function (record) {

        var newRecord = {};

        fields.forEach(function (propertyName) {
          newRecord[propertyName] = record[propertyName];
        });

        return JSON.stringify(newRecord);

      });

  mappedArray.forEach(function (record) {
    if (uniqueArray.indexOf(record) === -1) {
      uniqueArray.push(record);		
    }
  });

  return uniqueArray.map(function (record) {return JSON.parse(record)});

}

console.log(
  makeArrayOfUniqueRecords([{a: 1, b: 2, c: 0}, {a: 2, b: 1, c: 2}, {a: 1, b: 2, c: 3}, {a: 1, b: 2, c: 4}], ["a", "b"])
);

答案 2 :(得分:0)

试试这个:

let meta = new Set();

for (j = 0; j < $scope.myval.length; j++){
    let value = $scope.myval[j]._source;
    meta.add({LoginName: value.LoginName});
}

console.log(meta);

Set是仅保留唯一键的对象,因此您不必担心检查功能。此外,如果您只需要Array,则可以在for之后添加一个循环,例如:

let metaArr = [];

for (let key in meta) metaArr.push(key);