在用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;};
答案 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)