вставить значение в середине каждого значения внутри массива - PullRequest
1 голос
/ 04 июня 2019

У меня есть массив имеет значение ['a', 'b', 'c', 'd', 'e'] Теперь я хочу, чтобы он стал объектом, который имеет его значение, поэтому я делаю некоторое отображение массива

const arrs = ['a', 'b', 'c', 'd', 'e']
let arrObj = arrs.map(arr => {
    return {value: arr}
})

Теперь значение arrObj равно

[{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'd'}, {value: 'e'}]

Но я хочу вставить объект в середину каждого объекта внутри массива со значением {operator: '+'}, поэтому значение arrObj будет

[{value: 'a'}, {operator: '+'}, {value: 'b'}, {operator: '+'}, {value: 'c'}, {operator: '+'}, {value: 'd'}, {operator: '+'}, {value: 'e'}]

Теперь, используя javascript, как я могу выполнить эту функцию, если я устанавливаю значение arrObj в array.map ()?

Ответы [ 5 ]

2 голосов
/ 04 июня 2019

Используйте flatMap и верните пару из обратного вызова. Наконец, удалите лишний элемент.

const arrs = ['a', 'b', 'c', 'd', 'e']

let arrObj = arrs.flatMap(x => [
    {operator: '+'}, {value: x}
]).slice(1)

console.log(arrObj)

Если ваша платформа еще не имеет flatMap, это просто для polyfill:

Array.prototype.flatMap = function(fn) {
    return this.concat.apply([], this.map(fn))
}

Общая функция:

let interleave = (ary, val) => ary.flatMap(x => [val, x]).slice(1);

//

let arrObj = interleave(
    arrs.map(x => ( {value: x})),
    {operator: '+'}
)
2 голосов
/ 04 июня 2019

Вы можете создать новый массив с двойной длиной минус один и добавить необходимые значения в зависимости от индекса.

var values = ['a', 'b', 'c', 'd', 'e'],
    result = Array.from(
        { length: values.length * 2 - 1 },
        (_, i) => i % 2
            ? { operator: '+' }
            : { value: values[i >> 1] }
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2 голосов
/ 04 июня 2019

Один из вариантов - сопоставить каждый элемент (но последний) массиву с этим элементом, а другой - с +, а затем сгладить:

const arrs = ['a', 'b', 'c', 'd', 'e'];
const transformed = arrs
  .map((char, i) => (
    i === arrs.length - 1
    ? [{ value: char }]
    : [{ value: char }, { value: '+' }]
  ))
  .flat();
console.log(transformed);

Если + не появится во входном массиве, то вы можете сначала присоединиться к +, а затем разделить:

const arrs = ['a', 'b', 'c', 'd', 'e'];
const output = arrs
  .join('+')
  .split('')
  .map(value => ({ value }));
console.log(output);
0 голосов
/ 04 июня 2019

Создайте нужный объект и сгладьте его, как показано ниже:

var arrs = ['a', 'b', 'c', 'd','e'];
const arrObj = arrs.map((arr,i) => {
	let item = [{value: arr}];
  if(i < arrs.length-1)
 		item.push({operator: '+'});
  return item;
});
console.log(flattenDeep(arrObj));

function flattenDeep(arr1) {
       return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
    }

Для более подробной информации смотрите здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

0 голосов
/ 04 июня 2019

А как насчет уменьшения?

 let arrObj = arrs.reduce((acc, curr, index) => {
        if (index === arrs.length - 1) acc = [...acc, {value: curr}];
        else acc = [...acc, {value: curr}, {operator: '+'}];
        return acc;
    }, [])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...