Функция зеркало в DISTINCT MySQL, но в Array () языка сценариев JavaScript / jQuery

У меня есть следующий array объектов:

var arr = 
[
    {
        "TokenID":"1",
        "USR":"Andrey Homez",
        "mensaje":"Hi :)",
        "date":"2017-01-17 02:52:52"
    },
    {
        "TokenID":"2",
        "USR":"Andrey Homez",
        "mensaje":"Hey!",
        "date":"2017-01-17 02:53:22"
    },
    {
        "TokenID":"1",
        "USR":"Paola Gonzales",
        "mensaje":"Hola!",
        "date":"2017-01-17 02:52:52"
    }
]

Я хотел бы, чтобы он возвратил чистый array повторенной стоимости, в этом случае именно TokenID, повторяет стоимость 1.

Тогда, следующий Array () должен бы быть результатом.

arr =
[
    {
        "TokenID":"1",
        "USR":"Andrey Homez",
        "mensaje":"Hi :)",
        "date":"2017-01-17 02:52:52"
    },
    {
        "TokenID":"2",
        "USR":"Andrey Homez",
        "mensaje":"Hey!",
        "date":"2017-01-17 02:53:22"
    }
]

Что-то подобное

function distinct(array,indice){
}

Где indice это тот, которого он идет анализировать и проверять в array чтобы знать, есть ли повторенная стоимость, тогда он был бы:

distinct(arr,"TokenID");

Я не считаю хорошую идею делать один sort(). Точка (цель) состоит в том, чтобы у него был оригинально распределенный порядок.

Из какой формы я могу делать это?

1
задан 20.01.2017, 03:54
0 ответов

То, что ты мог бы делать в этой функции:

  1. Определять два arrays пустота:
    • Один для индексов, которые уже находились
    • и другой с не дублированными объектами
  2. Пробегать все элементы array, и если индекс объекта не в array индексов:
    • Добавлять объект к array не дублированных объектов
    • Добавлять индекс к array уже расположенных напротив индексов
  3. Возвращать array не дублированных объектов

Код был бы чем-то как это:

function distintos(arr, indice) {

  // variables auxiliares
  var indices = [];       // array con los índices ya usados
  var resultado = [];     // array con los objetos no duplicados

  // atravesamos el array original 
  for (var x = 0; x < arr.length; x++) {
    // si el índice no se ha encontrado previamente
    if (indices.indexOf( arr[x][indice] ) < 0) {
      // añadir ese objeto al array de resultados
      resultado.push( arr[x] );
      // añadir ese índice al array de índices encontrados
      indices.push( arr[x][indice] );
    }
  }

  // devolvemos los resultados
  return resultado;
}

Здесь я оставляю пример функционируя:

var datos = [
  {
    "TokenID":"1",
    "USR":"Andrey Homez",
    "mensaje":"Hi :)",
    "date":"2017-01-17 02:52:52"
  },
  {
    "TokenID":"2",
    "USR":"Andrey Homez",
    "mensaje":"Hey!",
    "date":"2017-01-17 02:53:22"
  },
  {
    "TokenID":"1",
    "USR":"Paola Gonzales",
    "mensaje":"Hola!",
    "date":"2017-01-17 02:52:52"
  }
];

function distintos(arr, indice) {
  var indices = [];
  var resultado = [];

  for (var x = 0; x < arr.length; x++) {
    if (indices.indexOf( arr[x][indice] ) < 0) {
      resultado.push( arr[x] );
      indices.push( arr[x][indice] );
    }
  }
  
  return resultado;
}

console.log("ANTES DE ELIMINAR DUPLICADOS");
console.log(JSON.stringify(datos));

datos = distintos(datos, "TokenID");

console.log("DESPUES DE ELIMINAR DUPLICADOS");
console.log(JSON.stringify(datos));
1
ответ дан 03.12.2019, 17:39
  • 1
    Спасибо за ответ, если бы он полюбил возвращенный array, что он приходил упорядоченный , датируйте . Возможно? Дело в том, что он считает много дату, в которой они были посланы, восходящей формы. Ясно. –  17.01.2017, 17:57
  • 2
    В этом случае, podrí схвати делать один sort с funció n собственная comparació n перед тем, как возвращать результат –  17.01.2017, 17:58
  • 3
    До сих пор твой ответ - má s преуспевшая, если я нахожу несовместимость с браузером, я должен искать другой ответ. –  17.01.2017, 18:01

Используя функцию Array.filter () ты можешь поддерживать или удалять элементы договоренности, которая поможет нам для нашей функции. В функции возврата .filter, он говорит нам документацию, которая, если он возвращается true, поддерживает элемент, или false по-другому.

функция distinct (): Создай временную переменную, которая будет сохранять единственную стоимость позже проверять, уже существуют ли они, по-другому поддерживать их в договоренности.

var arr = 
[
	{
		"TokenID":"1",
		"USR":"Andrey Homez",
		"mensaje":"Hi :)",
		"date":"2017-01-17 02:52:52"
	},
	{
		"TokenID":"2",
		"USR":"Andrey Homez",
		"mensaje":"Hey!",
		"date":"2017-01-17 02:53:22"
	},
	{
		"TokenID":"1",
		"USR":"Paola Gonzales",
		"mensaje":"Hola!",
		"date":"2017-01-17 02:52:52"
	}
];

function distinct(array,indice){
  var uniques = []; //temporal
  return array.filter(function(item){
    //indexOf buscará el valor, si no existe retornará true, por lo cual se mantendrá en el arreglo 
    //false en caso el valor ya exista en la variable uniques
    return uniques.indexOf(item[indice]) < 0 ? uniques.push(item[indice]) : false
  })
}

console.log("By TokenID:", distinct(arr, "TokenID"));
console.log("By USR:", distinct(arr, "USR"));
console.log("By date:", distinct(arr, "date"));
3
ответ дан 03.12.2019, 17:39
  • 1
    Я думаю, что Internet Explorer 8 не выносит nativamente функция filter :/ –  17.01.2017, 18:08
  • 2
    Лично, deberí схвати начинать использовать эти функции, если ты обращаешь внимание, в только, 3 lì neas достигли ожидаемого, IE всегда был проблемой, и всегда были решения для этого браузера. В самой documentació n Mozilla podrá s находить Polyfill , которые ты permitirá выносить .filter() в любом браузере. Приветствие –  18.01.2017, 06:50

Чтобы получать стоимость, не повторяя ты мог бы делать следующее:

  • Пробегать договоренность objectos
  • Создавать один hash где мы сохраняем стоимость, которая уже была расположенной напротив
  • Если стоимость не была найдена еще (eg, он не в hash) мы это добавляем в новой договоренности.

Например, я схватил:

function unique(array, prop) {
  var uniques = [],
      hash = {};
  
  array.forEach(function(object) {
    var value = object[prop];
    
    if (!hash[value]) {
        hash[value] = true;
        uniques.push(object);
    }
  });
  
  return uniques;
}

///

var arr = [{
  "TokenID":"1",
  "USR":"Andrey Homez",
  "mensaje":"Hi :)",
  "date":"2017-01-17 02:52:52"
}, {
  "TokenID":"2",
  "USR":"Andrey Homez",
  "mensaje":"Hey!",
  "date":"2017-01-17 02:53:22"
},{
  "TokenID":"1",
  "USR":"Paola Gonzales",
  "mensaje":"Hola!",
  "date":"2017-01-17 02:52:52"
}];

console.log(unique(arr, 'TokenID'));
1
ответ дан 03.12.2019, 17:39