Могу ли я добавить динамический ключ к объекту?

#javascript #object #key

#javascript #объект #Клавиша

Вопрос:

Как будет выглядеть функция, которая «вводит» входной объект? Я изучал эту тему, но не смог найти хороших ответов.

Итак, если у меня есть входной объект…

 var fruits = [{fruit: "apple", taste: "sour"},
              {fruit: "cherry", taste: "sweet", color: "red"}];


functionname(fruits, function(i) { return i.fruit; });

RETURN: 

   { "apple": [{fruit: "apple", taste: "sour"}],
   { "cherry": [{fruit: "cherry", taste: "sweet", color: "red"}]

functionname(fruits, function(i) { return i.taste.length; });

RETURN: 

   { "4": [{fruit: "apple", taste: "sour"}],
   { "5": [{fruit: "cherry", taste: "sweet", color: "red"}]
 

Комментарии:

1. Моя первоначальная мысль была forEach , но forEach — это Array.forEach(обратный вызов), поэтому вместо этого я бы сказал [].forEach.call 🙂

Ответ №1:

Вы могли бы использовать функцию, которая создает новый объект и возвращает элементы с нужным ключом.

Версия с Array#forEach

 function getKeyedArray(array, callback) {
    var object = Object.create(null);
    array.reduce(function (a) {
        var key = callback(a);
        object[key] = object[key] || [];
        object[key].push(a);
    });
    return object;
}

var fruits = [{ fruit: "apple", taste: "sour" }, { fruit: "cherry", taste: "sweet", color: "red" }];

console.log(getKeyedArray(fruits, function (i) { return i.fruit; }));
console.log(getKeyedArray(fruits, function (i) { return i.taste.length; })); 

Версия с Array#reduce

 function getKeyedArray(array, callback) {
    return array.reduce(function (r, a) {
        var key = callback(a);
        r[key] = r[key] || [];
        r[key].push(a);
        return r;
    }, Object.create(null));
}

var fruits = [{ fruit: "apple", taste: "sour" }, { fruit: "cherry", taste: "sweet", color: "red" }];

console.log(getKeyedArray(fruits, function (i) { return i.fruit; }));
console.log(getKeyedArray(fruits, function (i) { return i.taste.length; }));