是否有一个函数可以让一个对象在JavaScript中给定一个键数组和一个默认值

是否有一个函数可以让一个对象在JavaScript中给定一个键数组和一个默认值,javascript,arrays,object,Javascript,Arrays,Object,这将是预期的行为 a = ['foo', 'bar', 'thing', 'etc']; b = someFunction(a, false); b; //{'foo': false, 'bar': false, 'thing': false, 'etc': false} 我是否可以使用一些函数来获取一个数组和一个默认值,并生成一个对象,其中每个数组元素作为指向默认值的键 编辑:谢谢大家给我写我自己的建议。我只是想知道一个内置的,类似于python的默认dict的东西。有一个!碰巧它有确切的s

这将是预期的行为

a = ['foo', 'bar', 'thing', 'etc'];
b = someFunction(a, false);
b; //{'foo': false, 'bar': false, 'thing': false, 'etc': false}
我是否可以使用一些函数来获取一个数组和一个默认值,并生成一个对象,其中每个数组元素作为指向默认值的键

编辑:谢谢大家给我写我自己的建议。我只是想知道一个内置的,类似于python的默认dict的东西。

有一个!碰巧它有确切的
someFunction
名称

function someFunction(arr, value) {
    return arr.reduce(function(result, key) {
        result[key] = value;
        return result;
    }, {});
}

jsidle:

这里有一个函数,它将获取一个键列表和一个值。它创建一个对象,并使用提供的值动态设置其属性名称,然后返回它

function makeObj(keys, value) {
    var obj = {};
    if (keys instanceof Array) {
        for (var i = 0; i < keys.length; i++ ) {
            if (keys[i]) {
                obj[keys[i]] = value;
            }
        }
        return obj;
    }
    return false;
}

var a = ['foo', 'bar', 'thing', 'etc'];
var b = makeObj(a, false);
b; //{'foo': false, 'bar': false, 'thing': false, 'etc': false}
函数makeObj(键、值){
var obj={};
if(数组的键实例){
对于(变量i=0;i
或者,您可以将其设置为类(我知道您要求函数,但这是我要做的..):

函数makeObj(键、值){
if(数组的键实例){
对于(变量i=0;i
不是内置的,但是制作一个应该不会有问题。非常简单的任务。虽然这很有趣,但它也可能会让人困惑。@sphanley:“可能会让人困惑”——你的意思是什么?还请提供进一步的解释,说明这段代码的作用。仅仅一段代码通常是不够的。它完全满足问题的要求,具体来说,它“将接受一个数组和一个默认值,并生成一个对象,其中每个数组元素都作为指向默认值的键。”array.forEach函数在这里有文档记录:在本例中,Array.forEach函数接受一个回调函数,该函数使用数组中每个元素的参数调用,并向结果对象添加一个带有该数组元素名称和指定默认值的属性。为什么要测试
keys
是否为数组?函数不能仅仅要求它是一个数组才能正常工作吗?如果
keys
不是数组,它就没有任何用处。如果keys缺少成员,例如
['foo','bar']
,会发生什么情况?(您会得到一个名为“undefined”的属性。)@jfriend00没有JavaScript不是静态类型的。您可以使用各种扩展要求参数是特定的类型(或者只做我所做的),但不能要求它是C风格的。看:@nettux443-我不是这么说的。您是否测试您编写的每个函数的每个参数的类型?我不明白为什么有必要测试它是否是一个数组。此外,您是否知道,如果您使用任何跨窗口代码并从另一个窗口对数组进行操作,
instanceof
将不起作用。@jfriend00是的,我知道。测试变量类型是绝对必要的。如果有人认为传入的不是数组,上面的代码可以防止出现错误。请随意建议一种改进的检查输入的方法。
function makeObj(keys, value) {
    if (keys instanceof Array) {
        for (var i = 0; i < keys.length; i++ ) {
            if (keys[i]) {
                this[keys[i]] = value;
            }
        }
    }
}

var a = ['foo', 'bar', 'thing', 'etc'];
var b = new makeObj(a, false);
b; //{'foo': false, 'bar': false, 'thing': false, 'etc': false}
function someFunction(arr, defval)
{
  var resultObj = {};
  arr.forEach(function(el) { resultObj[el] = defval; });
  return resultObj;
}