Как удалить повторяющийся объект (строку) из массива в JavaScript

У меня есть два массива json с одним и тем же объектом, я хочу иметь json из этих двух json, который не включает дублированное значение, например, это мои jsons:

json1=["one","two"];
json2=["one","two","three","four"];

результат должен быть:

result=["three","four"]

ты знаешь, как это сделать, спасибо

Это массивы строк или массивы объектов? В вашем примере показаны строки, но в заголовке написаны объекты.

matmo 25.05.2018 23:02

массивы строк

Jan 25.05.2018 23:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
71
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Решение с использованием функции уменьшения и фильтрации:

const json1 = ["one","two"];
const json2 = ["one","two","three", "four"];

const result = json2
  .reduce((acc, cur) => acc.indexOf(cur) > -1 ? acc : acc.concat(cur), json1)
  .filter(item => json1.indexOf(item) === -1 || json2.indexOf(item) === -1);

console.info(result); // ["three", "four"]

вот код это функция, которая в основном вычитает 2 массива и возвращает результирующий массив

a1 и a2 - это 2-й массив

a - пустой массив, который имеет истинное значение во всех a1 [index]

а1 = [1,4,5]; а = [0,1,0,0,1,1];

1 = верно как это

теперь мы проверяем id, присутствует ли a2 [index] в a

если a2 = [1,3];

тогда a [a2 [atanyindex]] будет a = [0,1,0,0,1,1];

.................................................. ........ ^ 1 и если это произойдет, удалите этот элемент

добавить оставшиеся элементы в массив diff а массив diff - это вычитание 2-х массивов, также как и требуемый ответ

function arr_diff(a1, a2) {

    var a = [], diff = [];

    for (var i = 0; i < a1.length; i++) {
        a[a1[i]] = true;
    }

    for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
            delete a[a2[i]];
        } else {
            a[a2[i]] = true;
        }
    }

    for (var k in a) {
        diff.push(k);
    }

    return diff;
}
"Вот код" не учит OP или будущих пользователей. Расскажите подробнее о том, что вы использовали и почему.
Patrick Evans 25.05.2018 23:10

Вы можете объединить массивы, а затем отфильтровать дубликаты, сравнивая indexOf и lastIndexOf для каждого элемента:

const json1 = ["one", "two"];
const json2 = ["one", "two", "three", "four"];

const withoutDupes = [...json1, ...json2].filter((item, idx, array) => {
  if (array.indexOf(item) === array.lastIndexOf(item)) {
      return item;
  }
});

console.info(withoutDupes);
Ответ принят как подходящий
function myFilter(arraySmall, arrayBig){
  var result = [];

  for (var i = 0; i < arrayBig.length; i++) {
    if (arraySmall.indexOf(arrayBig[i]) === -1){ //ie. if item not exists in arraySmall
      result.push(arrayBig[i]);
    }
  }

  return result;
}

Вы можете просто вызвать myFilter(json1, json2);

Это работает, только если json2 всегда больше, чем json1.

Kevin Boucher 25.05.2018 23:54

Работает нормально, даже если json2 меньше. Имена аргументов могли бы быть лучше, например (bannedWords, orignalWords)

Morris 25.05.2018 23:57

@KevinBoucher Это не работает даже в этом случае, просто предположим, что массивы [1] и [2], результат должен быть [1, 2], и вышеупомянутый алгоритм не даст такого результата, какой бы порядок вы ни выбрали, поскольку он просто далек от правильного.

Matus Dubrava 26.05.2018 09:19

@MatusDubrava, возможно, вы неправильно истолковали исходный вопрос Яна. В вашем примере желаемый результат должен быть: [2]. Если мы последуем вашему предложению, вы будете искать: function myFilter(arraySmall, arrayBig){ var _all = arraySmall.concat(arrayBig); var _obj = {}; for (var i = 0; i < _all.length; i++) { _obj[_all[i]] = "whatever"; } return Object.keys(_obj); }

Morris 27.05.2018 17:43

Вы можете сделать это вот так. Используйте Array.prototype.reduce, чтобы выбрать все элементы, которые находятся в первом массиве, а не во втором. Затем используйте его таким же образом, чтобы выбрать все элементы, которые находятся во втором, а не в первом. И, наконец, объедините эти два результата.

const _removeCommon = (xs, ys) =>
  xs.reduce((acc, v) => ys.includes(v) ? acc : acc.concat(v), []);

const removeCommon = (xs, ys) =>
  [..._removeCommon(xs, ys), ..._removeCommon(ys, xs)];

const json1=["one","two"];
const json2=["one","two","three","four"];

console.info(removeCommon(json1, json2));

@ Янв, попробуйте следующий код.

It uses filter() and concat() methods defined on arrays.

json1=["one","two"];
json2=["one","two","three","four"];

var arr1 = json1.filter((key) => {
       if (json2.indexOf(key) == -1) 
            return true
       else 
            return false
})

var arr2 = json2.filter((key) => {
       if (json1.indexOf(key) == -1) 
            return true
       else 
            return false
 })

result = arr1.concat(arr2)
console.info(result)

Вы можете просто использовать concat и filter довольно просто.

function noDupes(arr1,arr2){
  return arr1.concat(arr2).filter((item,index,arr)=>{
    if (arr1.includes(item)&&arr2.includes(item))
        return false
    else
        return item
  })
}

Вот решение, если вы не знаете / не заботитесь о том, какой массив самый длинный. Не очень кратко, но легко читается и понимается.

function myFilter(arr1, arr2) {

const combined = [...arr1, ...arr2]

const seen = new Set()

combined.forEach(item => {
  if (seen.has(item)) {
    seen.delete(item)
  } else {
    seen.add(item)
  }
})

return Array.from(seen)

}

Сначала мы используем оператор распространения, чтобы легко объединить оба массива в один.

Затем мы создаем новый набор, который будет похож на ведро, в которое мы бросаем наши значения.

Затем мы будем использовать forEach, чтобы перебрать объединенный массив и спросить «Мы видели это значение раньше? Если да, давайте удалим его, потому что это означает, что оно не уникальное; в противном случае давайте добавим его в набор».

Наконец, мы используем Array.from (), чтобы превратить наш набор в массив и вернуть его.

Это дает вам 3 результата в зависимости от аргумента типа.

(1) uniq: без дубликатов (2) "дубликат" (3) 'not_duplicate'

let json1 = ['one', 'two']
let json2 = ['one', 'two', 'three', 'four']

function uniq_n_shit (arr1, arr2, type) {

  if (!type || type === 'uniq' || type === 'unique') {

    return [...new Set(arr1.concat(arr2))]

  } else if (type === 'duplicate') {

    let concat = arr1.concat(arr2)
    return concat.filter(function (obj, index, self) {
      return index !== self.indexOf(obj)
    })

  } else if (type === 'not_duplicate') {

    let concat = arr1.concat(arr2)
    let set = [...new Set(concat)]
    let remove = concat.filter(function (obj, index, self) {
      return index !== self.indexOf(obj)
    })

    for (let r = 0; r < remove.length; r++) {
      let i = set.indexOf(remove[r]);
      if (i !== -1) {
        set.splice(i, 1);
      }
    }

    return set

  }
}

console.info(uniq_n_shit(json1, json2, null)) // => [ 'one', 'two', 'three', 'four' ]
console.info(uniq_n_shit(json1, json2, 'uniq')) // => [ 'one', 'two', 'three', 'four' ]
console.info(uniq_n_shit(json1, json2, 'duplicate')) // => [ 'one', 'two' ]
console.info(uniq_n_shit(json1, json2, 'not_duplicate')) // => [ 'three', 'four' ]

Другие вопросы по теме