многомерный массив по умолчанию - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть два многомерных массива:

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

Желаемый результат:

const expected = [
  ["ad", 50],
  ["ae", 0],
  ["af", 0]
]

Здесь az игнорируется, потому что он недопустим, потому что его нет в defaultData.объявление является действительным, и поэтому значение 0 перезаписывается значением 50.

Как лучше всего получить этот результат.Спасибо?

Пожалуйста, предположите, что ни один массив не отсортирован.Ожидаемый результат также не нужно сортировать.

Либо ванильный JS или Lodash в порядке.

Ответы [ 5 ]

2 голосов
/ 25 апреля 2019

Преобразовать data в объект (dataByKey) с помощью _.fromPairs().Сопоставьте defaultData и проверьте, существует ли «ключ» (индекс 0) в dataByKey.Если это так, создайте новый массив со значением dataByKey.Если нет, вернуть исходный массив.

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

const dataByKey = _.fromPairs(data)

const result = defaultData.map(o => o[0] in dataByKey ? [o[0], dataByKey[o[0]]] : o)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 25 апреля 2019

Вы можете использовать карту / уменьшить как это:

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

const result = defaultData.map(arr => data.reduce(([dKey, dVal], [key, val]) => [ dKey, dKey === key ? val : dVal ], arr));

console.log(result);
1 голос
/ 25 апреля 2019

Используйте map для итерации по defaultData и find, чтобы сопоставить каждый повторяющийся массив с data:

const defaultData = [['ad', 0],['ae', 0],['af', 0]];
const data = [['az', 20],['ad', 50]];

const expected = defaultData.map(arr => {

  // Destructure the first element from `arr`
  // and assign it to `code`
  const [ code ] = arr;

  // `find` the array in `data` where the first element
  // matches `code`
  const found = data.find(el => el[0] === code);

  // If `found` is undefined return the whole array
  // otherwise return a new array with the code and the value
  // from the found array
  return found ? [code, found[1]] : arr;
});

console.log(expected);
1 голос
/ 25 апреля 2019

Вы можете сначала создать один объект из данных, а затем использовать метод map в defaultData, чтобы создать новый массив и получить значение из данных по ключу.

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
].reduce((r, [key, value]) => {
  r[key] = (r[key] || 0) + value;
  return r;
}, {})

const expected = defaultData.map(([key, value]) => {
  return [key, key in data ? data[key] : value] 
})

console.log(expected)
1 голос
/ 25 апреля 2019

Попробуйте, я использую map () для создания нового массива и find () для поиска элементов из второго массива.

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

Если у меня есть соответствующий элемент, я создаю новый массив, используя его элементы. Если у меня нет соответствующего элемента, я создаю новый, используя элементы по умолчанию для элемента по умолчанию.

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

let newData = defaultData.map(eachDefault => {
  let found = data.find(eachData => {
    if (eachData[0] == eachDefault[0]) {
      return true
    }
  })
  if (found) {
    return [...found]
  }
  return [...eachDefault]
})

console.log(newData)
...