将值插入数组中每个值的中间

时间:2019-06-04 07:00:11

标签: javascript arrays json object

我有一个数组,其值是['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,考虑到我要在array.map()中设置arrObj的值,如何实现该功能?

5 个答案:

答案 0 :(得分:2)

一种选择是将每个元素(但最后一个)映射到具有该元素的数组,并将另一个映射到+,然后展平:

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);

答案 1 :(得分:2)

使用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 :(得分:2)

您可以创建一个新数组,该数组的长度加倍减一,并根据索引添加所需的值。

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; }

答案 3 :(得分:0)

使用reduce怎么办?

 let arrObj = arrs.reduce((acc, curr, index) => {
        if (index === arrs.length - 1) acc = [...acc, {value: curr}];
        else acc = [...acc, {value: curr}, {operator: '+'}];
        return acc;
    }, [])

答案 4 :(得分:0)

合并所需的对象,并将其深层展平,如下所示:

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