我有一个数组,其值是['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的值,如何实现该功能?
答案 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