удалить объект из массива, где один ключ является дубликатом, а другой ключ меньше другого

, если ваша InputStream поддерживает использование метки, вы можете mark() использовать ваш входной поток, а затем reset(). если ваш InputStrem не поддерживает отметку, вы можете использовать класс java.io.BufferedInputStream, чтобы вы могли встраивать свой поток внутри BufferedInputStream, например

    InputStream bufferdInputStream = new BufferedInputStream(yourInputStream);
    bufferdInputStream.mark(some_value);
    //read your bufferdInputStream 
    bufferdInputStream.reset();
    //read it again
3
задан Dan Mishin 18 March 2019 в 03:11
поделиться

3 ответа

Вы можете использовать reduce для обхода массива и сохранения набора ключей (number), чтобы проверить, существует ли он. Затем вставьте новый массив.

var data=[
    { number: '31907411282', unix_date: '1547012427' },
    { number: '31907411282', unix_date: '1547013214' },
    { number: '31907514691', unix_date: '1547015155' },
    { number: '31907514691', unix_date: '1547015232' },
    { number: '31907514691', unix_date: '1547016134' },
    { number: '31907514691', unix_date: '1547016443' },
    { number: '31907638716', unix_date: '1547017122' },
    { number: '31907644067', unix_date: '1547017381' }
]
const rs = data.reduce((acc, e) => {
  if(!acc.number.has(e.number)) {
    acc.newData.push(e)
    acc.number.add(e.number)
  }
  return acc
}, {number: new Set(), newData: []})

console.log(rs.newData)

0
ответ дан bird 18 March 2019 в 03:11
поделиться

Вы можете использовать уменьшение, чтобы добиться этого:

var data = [{
    number: '31907411282',
    unix_date: '1547013214'
  },
  {
    number: '31907411282',
    unix_date: '1547012427'
  },
  {
    number: '31907514691',
    unix_date: '1547015155'
  },
  {
    number: '31907514691',
    unix_date: '1547015232'
  },
  {
    number: '31907514691',
    unix_date: '1547016134'
  },
  {
    number: '31907514691',
    unix_date: '1547016443'
  },
  {
    number: '31907638716',
    unix_date: '1547017122'
  },
  {
    number: '31907644067',
    unix_date: '1547017381'
  }
];

let filtered = data.reduce((acc, item) => {
  if (!acc.some((e, i) => {
      if (item.number === e.number) {
        if (item.unix_date < e.unix_date) {
          acc.splice(i, 1, item);
        }
        return true;
      }
    })) {
    acc.push(item);
  }
  return acc;
}, []);

console.log(filtered);

Надеюсь, это поможет,

0
ответ дан Miroslav Glamuzina 18 March 2019 в 03:11
поделиться

Сортируйте элементы по дате, уменьшите массив, сохранив только элементы, у которых есть number, которого еще нет в массиве аккумулятора.

let data = [{
      number: '31907411282',
      unix_date: '1547013214'
    },
    {
      number: '31907411282',
      unix_date: '1547012427'
    },
    {
      number: '31907514691',
      unix_date: '1547015155'
    },
    {
      number: '31907514691',
      unix_date: '1547015232'
    },
    {
      number: '31907514691',
      unix_date: '1547016134'
    },
    {
      number: '31907514691',
      unix_date: '1547016443'
    },
    {
      number: '31907638716',
      unix_date: '1547017122'
    },
    {
      number: '31907644067',
      unix_date: '1547017381'
    }
    ];

    let filtered = data
      .sort((a, b) => (a.unix_date > b.unix_date) ? 1 : -1)
      .reduce((acc, item) => {
        if (!acc.find(el => el.number === item.number)) {
          acc.push(item)
        }
        return acc
      }, []);

      console.log(filtered);
0
ответ дан djheru 18 March 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: