2016-11-03 5 views
2

У меня есть два массива, которые я хочу манипулировать. Он будет использоваться в качестве списка.Карта двух массивов и удаления дубликатов, сохраняя все элементы

Предположим, что система отображает пользователя, какие фрукты являются их любимыми в списке. Система отобразит несколько фруктов, и она может отметить те, которые ей нравятся, которые будут прикреплены к их позиции (индексу).

Остальные (нулевые/непривязанные) позиции будут заполнены, все остальные фрукты будут доступны.

Ниже код:

let favoriteFruits = [null, null, 'banana', null, 'pineapple', null, null, null, null, null] 
 
let allFruits = ['grape', 'banana', 'orange', 'pineapple', 'blueberry', 'strawberry'] 
 
let fruitsDisplayed = new Array(10) 
 

 
allFruits = allFruits.filter(fruit => !favoriteFruits.includes(fruit)) 
 

 
fruitsDisplayed = favoriteFruits.slice(0) 
 
fruitsDisplayed = fruitsDisplayed.map((fruit, i) => fruit == null ? allFruits[i] : fruit) 
 

 
console.log(fruitsDisplayed)

Поскольку favoriteFruits собраны из allFruits (пользователь может выбрать только ее любимый, если он доступен на нашем все список), что происходит, когда пользователь любимый данный фрукт (и индекс объекта хранится в списке), заключается в том, что когда я повторяю массив allFruits для заполнения нулевых пробелов, он вызывает дублирование, чего я хочу избежать.

Ожидаемый результат: fruitsDisplayed be favoriteFruits ostored n их позиции, добавлено allFruits на все пустые пробелы **, кроме тех, которые уже были предоставлены **. Я не могу сейчас думать об этом.

Обратите внимание, что у меня нет контроля над favoriteFruits, который их фрукты/указатели задают пользователем.

То, что я пытаюсь выполнить (нуль-пространства предназначены, чтобы быть там):

текущий результат:

(где мой черника ??)

[ 
    "grape", 
    "orange", 
    "banana", 
    "strawberry", 
    "pineapple", 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined 
] 

ожидается

[ 
    "grape", 
    "orange", 
    "banana", // already favorited 
    "blueberry", 
    "pineapple", // already favorited 
    "strawberry", 
    undefined, 
    undefined, 
    undefined, 
    undefined 
] 

Я не эксперт по JavaScript, с o если ответ отвечает на любую практику кода, которую я делаю, я с радостью отредактирую, чтобы соответствовать моим потребностям.

+0

Я хотел бы предложить, если вы ищете для этого типа логики во многих местах в вашем приложении, вы заканчивали Lodash.js. У этого есть много цепных методов, чтобы сделать то, что Вы ищете здесь. – jusopi

+0

@MikeMcCaughan не очень.Я хочу объединить их, но я бы хотел сохранить любимую позицию. –

+0

@jusopi спасибо, но я думаю, что этот код очень возможен с простым JavaScript. Добавление библиотеки здесь было бы излишним. –

ответ

2

Вы можете использовать Set и удалить используемые элементы и строить, то новый массив с favoriteFruits.

var favoriteFruits = [null, null, 'banana', null, 'pineapple', null, null, null, null, null], 
 
    allFruits = ['grape', 'banana', 'orange', 'pineapple', 'blueberry', 'strawberry'], 
 
    fruitsDisplayed, 
 
    fruitSet = new Set(allFruits), 
 
    restFruit; 
 
\t \t 
 
favoriteFruits.forEach(a => fruitSet.delete(a)); 
 
restFruits = [...fruitSet], 
 
fruitsDisplayed = favoriteFruits.map(a => a || restFruits.shift()); 
 

 
console.log(fruitsDisplayed);

+1

Будучи счастливо забывчивым, работая в Coffeescript, я не слышал о Set. Спасибо, что поделился. – jusopi

0

Первый вид третьего массива, который имеет элементы как первого, так и второго массива.

 var arr3 = []; 
    arr1.forEach(function(item){ 
     arr3.push(item); 
     }); 
    arr2.forEach(function(item){ 
     arr3.push(item); 
    } 

затем используйте эту функцию.

var deduped = arr3.filter(function (el, i, arr) { 
    return arr.indexOf(el) === i; 
    }); 

    console.log(deduped); 

Источник: http://www.jstips.co/en/deduplicate-an-array/

+0

он делает дедупус, но не сохраняет любимую позицию Фруктов –

+0

Я внимательно прочитал вопрос. Вам даже не нужно поддерживать два массива. Просто сделайте один массив, который будет массивом объектов, и установите свойство isFavorate как false по умолчанию. Установите, чтобы это было правдой, если пользователь выбрал это. Таким образом, вы сохраняете заказ, и нет необходимости поддерживать два массива. – Pavan

Смежные вопросы