Подтвердить что ты не робот

Как я могу сопоставить массив с повторяющимися значениями с уникальным массивом в Javascript?

У меня есть следующий массив:

var tst = 
[
 {"topicId":1,"subTopicId":1,"topicName":"a","subTopicName":"w"},
 {"topicId":1,"subTopicId":2,"topicName":"b","subTopicName":"x"},
 {"topicId":1,"subTopicId":3,"topicName":"c","subTopicName":"y"},
 {"topicId":2,"subTopicId":4,"topicName":"c","subTopicName":"z"}
]

Есть ли простой способ, которым я могу сопоставить это с таким массивом, где topicId > id и topicName > name:

var t = 
[
  {"id":1,"name":"a"},
  {"id":2,"name":"c"}
]

Я использую современный браузер, и у меня также есть _lodash, если это помогает. Обратите внимание, что в массиве tst будет около 100 строк, поэтому мне не нужно очень оптимизированное решение. Было бы более простым и простым в обслуживании решением.

4b9b3361

Ответ 1

САМЫЙ ПОСЛЕДНИЙ

_. uniqBy теперь предпочтительнее

Полный рабочий пример здесь

var tst = [
 {"topicId":1,"subTopicId":1,"topicName":"a","subTopicName1":"w"},
 {"topicId":2,"subTopicId":2,"topicName":"b","subTopicName2":"x"},
 {"topicId":3,"subTopicId":3,"topicName":"c","subTopicName3":"y"},
 {"topicId":1,"subTopicId":4,"topicName":"c","subTopicName4":"z"}
];

var result = _.map(_.uniqBy(tst, 'topicId'), function (item) {
    return {
        id: item.topicId,
        name: item.topicName
    };  
});

console.log(result);

LEGACY

http://lodash.com/docs#uniq - хорошее начало

_.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');

Ваш код будет выглядеть так, чтобы уникальные темы были уникальны по id

var t = _.uniq(tst, 'topicId');

ИЗМЕНИТЬ

Я сделал jsfiddle

http://jsfiddle.net/q5HNw/

UPDATE

Удалена ненужная уникальность имен

http://jsfiddle.net/q5HNw/1/

Ответ 2

Я один из тех парней, которые используют собственные функции:)

var results = tst.reduce(function(res,topic){
var exists = res.some(function(t){ return (t.id === topic.topicId && t.name === topic.topicName);});        
     if (!exists){
        res.push({"id": topic.topicId, "name": topic.topicName});
     }
return res; },[]);

версия Lodash

Я не эксперт, использующий lodash, возможно, я попробую что-то вроде этого:

var results = _.reduce(tst, function(res, topic){       
    var exists = _.findIndex(res, function(t){
        return (t.id === topic.topicId && t.name === topic.topicName);
    });
    if (exists === -1){
      res.push({"id": topic.topicId, "name": topic.topicName});
    }
    return res; 
},[]);

Ответ 3

Использование ECMAScript 2015 Array.prototype.find()

let tst = [
 {"topicId":1,"subTopicId":1,"topicName":"a","subTopicName":"w"},
 {"topicId":1,"subTopicId":2,"topicName":"b","subTopicName":"x"},
 {"topicId":1,"subTopicId":3,"topicName":"c","subTopicName":"y"},
 {"topicId":2,"subTopicId":4,"topicName":"c","subTopicName":"z"}
];

let t= [];
tst.forEach(obj => {
  // Check if the id already exists in t 
  if (!t.find((self) => self.id === obj.topicId)) {
    // If not, pushes obj to t
    t.push({
      id: obj.topicId,
      name: obj.topicName
    });
  }
});

Вы также можете сравнить несколько свойств:

let t= [];
tst.forEach(obj => {
  // Check if the id and subId already exist in t 
  if (!t.find((self) => self.id === obj.topicId && self.subId === obj.subTopicId)) {
    // If not, pushes obj to t
    t.push({
      id: obj.topicId,
      subId: obj.subTopicId,
      name: obj.topicName
    });
  }
});