将数组的元素转换为对象/ Javascript

时间:2018-07-05 14:10:26

标签: javascript

在用JS创建简单的Notes管理器方面遇到了挑战,我编写了一个函数,该函数接受一个字符串,为其提供ID和ID,并将其推入一个便笺数组。

let nextId = 0;
const getId = () => nextId++;
let notes = [{id: getId(), value: 'Note'}];

const addNote = (input) => {
notes.push({id:getId(), value: input});
console.log('Note added');

我现在正在使用一个将多个字符串作为参数的函数

('own', 'snail', 'platypus')

为每个具有id / value(string)的元素创建一个对象,并将其推送到主数组。

结果应类似于:

[{ id: 1, value: 'owl'},
 { id: 2, value: 'snail'}]

到目前为止,我已经知道了,它可以正确分配ID,但是循环失败

const batchAddNotes = (values) => {
let obj = {};
for (i = 0; i < values.length; i++) {
    obj.id = (getId());
    obj.value = (values[i]);}
return obj;};

6 个答案:

答案 0 :(得分:1)

要使您的变量在一定范围内,我会将它们打包在一个类(或一个函数)中。当您使用箭头功能时,该类应该没问题。按照显示的方式添加多个节点;使用var-args,您可以创建一个期望使用(...input)

的方法

class Notes {
  constructor() {
    this.nextId = 0;
    this.nodes = [{
      id: this.getId(),
      value: 'Note'
    }];
  }

  addNote(input) {
    this.nodes.push({
      id: this.getId(),
      value: input
    })
  }

  getId() {
    return this.nextId++;
  }

  addNotes(...input) {
    input.forEach(e => this.addNote(e));
  }
}

const notes = new Notes();
notes.addNotes('own', 'snail', 'platypus');
console.log(notes.nodes);

答案 1 :(得分:0)

使用函数自变量对象。它是所有传递给函数的参数的数组。然后,您可以遍历它们并每次在它们上运行功能。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

答案 2 :(得分:0)

您可以将函数中传递的arguments用作var args

const addNote = _ => {
     for(var i = 0; i < arguments.length; i++){
           notes.push({id:getId(), value: arguments[i]});
           console.log('Note added');
     }
}

答案 3 :(得分:0)

使用rest params

const myFn = (...values) => {
  let tmpArr = [];
  for(let i = 0 ; i < values.length ; i++){
    tmpArr.push({
      id : i + 1,
      value : values[i]
    });
  }
  return tmpArr;
}

const result = myFn('own', 'snail', 'platypus');

console.log(result);

答案 4 :(得分:0)

这是使用Rest Params并重新使用第一个函数时的外观。 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters)。

您可以根据需要添加很多注释(addMultipleNotes可以接收不定数量的参数)

let nextId = 0;
const getId = () => nextId++;
let notes = [{id: getId(), value: 'Note'}];

const addSingleNote = (input) => {
    notes.push({id:getId(), value: input});
    console.log('Note added');
};

const addMultipleNotes = (...args) => {
    for(let i = 0; i < args.length; i++){
        addSingleNote(args[i]);
    }
};

addMultipleNotes('one', 'two', 'three');
console.log(notes);

答案 5 :(得分:0)

首先,请注意我如何使用IIFE和闭包来创建id生成器。

另一方面,其余参数Array#map和参数传播是您的朋友:

const incrId = (() => {
  let id = 0

  return () => ++id
})()

const valuesToNotes = (...values) => values.map(value => ({
  id: incrId(),
  value
}))

const notes = []

// Parameter spread (i.e. '...') gives each
// array item in the output of valuesToNotes
// as if you would use Function#apply
notes.push(...valuesToNotes('a', 'b', 'c'))

console.log(notes)

另一种更实用的方法,不会改变输入notes并产生一个新的带有现有音符以及从values转换而来的音符:

const concat = xs => ys => xs.concat(ys)
const map = f => xs => xs.map(f)
const pipe = xs => x => xs.reduce((r, f) => f(r), x)

const incrId = (() => {
  let id = 0

  return () => ++id
})()

const valueToNote = value => ({
  id: incrId(),
  value
})

const notes = []
const appendNotes = pipe([map(valueToNote), concat(notes)])
const moreNotes = appendNotes(['a', 'b', 'c'])

console.log(moreNotes)