2016-09-21 7 views
0

У меня есть ответ elasticsearch ($ scope.myval), который содержит 100 записей деталей пользователя. Из этих 100 записей мне нужен список только имен пользователей и нескольких других полей, из которых я знаю, что есть только 5 уникальных записей.Javascript создает массив уникальных объектов из объекта

То, что я пытаюсь сделать, это создать новый массив только уникальных объектов.

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 пуст.

Любые мысли?

+4

'для (к = 0, к Nonemoticoner

+0

Вы начинаете с пустым массивом. , и ожидая его заполнения, используя длину этого пустого массива. – evolutionxbox

ответ

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, 
    }); 
} 
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); \t \t 
 
    } 
 
    }); 
 

 
    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"]) 
 
);

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 является объект, который хранит только уникальные ключи, так что вам не придется беспокоиться о проверке функции. Кроме того, если вам нужен только массив можно добавить еще один цикл после for, что-то вроде:

let metaArr = []; 

for (let key in meta) metaArr.push(key); 
Смежные вопросы